我正在尝试在数组上编写一个包装器,我在下面提出了代码:
myList = function () { };
myList.prototype.innerArray = [];
myList.prototype.add = function(pt) { this.innerArray.push (pt); return this; };
对于myList我创建的每个对象,我希望得到一个空属性innerArray。但我恐怕还没有真正理解原型的概念,因为:
m = new myList().add(4).add(5);
m.innerArray.length;
返回2,到目前为止一直很好,但现在我做了:
j = new myList();
j.innerArray.length;
也返回2,我本来期望0(一个全新的innerArray);我担心我会遗漏一些基本的东西。
答案 0 :(得分:2)
您不希望将原型与innerArray一起使用。在构造函数中,只需执行this.innerArray = []
,现在就有了一个实例变量。通过使用原型,您将创建一个类属性(例如,在类实例之间共享),而不是实例变量(例如,类的实例是唯一的)。
答案 1 :(得分:1)
你应该做
myList = function () { this.innerArray = []; };
这样:
myList.prototype.innerArray = [];
创建所有实例共有的innerArray
变量。
答案 2 :(得分:1)
myList
的所有实例共享完全相同的原型对象。它不会复制或克隆到每个实例。对于函数,这很好,因为当您调用foo.add()
时,this
是实例,允许您获取每个实例值。 foo.add
和bar.add
是相同的函数对象,但this
在每个调用中都不同。但是当您更改原型时直接在原型上使用值,它们会针对所有实例进行更改,因为它们都指向相同的对象。
相反,你想在构造函数中创建一个新数组:
myList = function () {
this.innerArray = [];
};
myList.prototype.add = function(pt) {
this.innerArray.push (pt);
return this;
};