开发中经常遇到这样的问题?在函数外部想要访问函数变量,通常我们会想到使用闭包来实现。那么今天就来一个更加惊悚的话题:我们欲想通过函数原型上的方法,来操作函数内部的变量,听起来好像很无所谓的样子,实际上单单一个闭包来讲就显得很苍白无力了。花了好几个小时算是终于实现了:首先定义一个构造函数 Person 人类,函数体内有一个数组 frends 朋友集合(默认为空),Person 原型上挂有三个方法,分别为 makeFriends(fd) :认识一个朋友、getFriends(fd):查找一个/所有个朋友、removeFriend():删除一个朋友。遇到问题:如何通过这些方法操作构造函数内部的变量?添加的数据有且-仅有-只能-通过提供 getFriends() 方法来获取。二话不说,直接上代码吧!
function Person (name) { var friends = []; this.name = name; if (this.constructor.name === 'Temp') return friends; } Person.prototype.makeFriend = function (fd) { if (!fd) return '参数异常'; function Temp () {}; var fds = Person.call(new Temp()); if (fds.indexOf(fd) !== -1) return; fds.push(fd); var props = Person.prototype; Person = (function (fds) { return function Person (name) { var friends = fds; this.name = name; if (this.constructor.name === 'Temp') return friends; } }(fds)) Person.prototype = props; return fd; } Person.prototype.removeFriend = function (fd) { function Temp () {}; var fds = Person.call(new Temp()); if (fds.indexOf(fd) === -1) return '查询无数据'; fds.splice(fds.indexOf(fd), 1); var props = Person.prototype; Person = (function (fds) { return function Person (name) { var friends = fds; this.name = name; if (this.constructor.name === 'Temp') return friends; } }(fds)) Person.prototype = props; return '删除成功'; } Person.prototype.getFriends = function (name) { function Temp () {}; var friends = Person.call(new Temp()); if (name === undefined) return friends; var index = friends.indexOf(name) return index !== -1 ? friends[index] : '查询无数据'; } var lt = new Person('老唐');
发表评论