开发中经常遇到这样的问题?在函数外部想要访问函数变量,通常我们会想到使用闭包来实现。那么今天就来一个更加惊悚的话题:我们欲想通过函数原型上的方法,来操作函数内部的变量,听起来好像很无所谓的样子,实际上单单一个闭包来讲就显得很苍白无力了。花了好几个小时算是终于实现了:首先定义一个构造函数 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('老唐'); 
发表评论