javascript初始化对象属性?

时间:2011-06-24 20:39:25

标签: javascript function attributes initialization prototype-programming

我正在尝试在数组上编写一个包装器,我在下面提出了代码:

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);我担心我会遗漏一些基本的东西。

3 个答案:

答案 0 :(得分:2)

您不希望将原型与innerArray一起使用。在构造函数中,只需执行this.innerArray = [],现在就有了一个实例变量。通过使用原型,您将创建一个类属性(例如,在类实例之间共享),而不是实例变量(例如,类的实例是唯一的)。

答案 1 :(得分:1)

你应该做

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

这样:

myList.prototype.innerArray = [];

创建所有实例共有的innerArray变量。

答案 2 :(得分:1)

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

相反,你想在构造函数中创建一个新数组:

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