-1

我试图写一个阵列上的包装,我想出了下面的代码:JavaScript初始化对象属性?

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);恐怕我错过了一些基本的东西。

回答

1

myList的所有实例共享完全相同的原型对象。它不会复制或克隆到每个实例。对于函数来说这很好,因为当你调用foo.add()时,this就是实例,允许你获取每个实例的值。 foo.addbar.add是相同的功能对象,但this在每次调用中都不相同。但是,当你改变它们时,直接在原型上的值会改变为所有实例,因为它们都指向相同的对象。

相反,你想在构造一个新的数组:

myList = function() { 
    this.innerArray = []; 
}; 
myList.prototype.add = function(pt) { 
    this.innerArray.push (pt); 
    return this; 
}; 
2

你不想在innerArray中使用原型。在你的构造函数中简单地做this.innerArray = [],现在你有一个实例变量。通过使用原型,您正在创建类属性(例如,在类实例之间共享),而不是实例变量(例如,对类的实例唯一的)。

1

你应该做

myList = function() { this.innerArray = []; }; 

就象这样:

myList.prototype.innerArray = []; 

创建innerArray变量适用于所有情况。