原型对象的数组

时间:2013-03-08 19:31:00

标签: javascript arrays object prototype

我在这里遇到了一个很好的问题。我需要理解这个

Foo = function(){
};


Foo.prototype = {
buttons: new Array(),
index:'',
add: function(value)
{
    this.buttons.push(value);
},
clear:function(){
    this.buttons=new Array();
},
count:function(){
    return(this.buttons.length);
},
setIndex:function(index){
    this.index;
},
getIndex:function(index){
    return this.index;
}
};

var A= new Foo();
var B= new Foo();

A.add('toto');
B.add('tata');

A.setIndex(8);
B.setIndex(44);

alert(A.count()+"---"+A.getIndex());

那段代码给了我:“2 --- 8”!!

所以A.count()返回A.count()+ B.count()。与B.count()相同!!

任何人都可以解释一下这个问题吗?怎么做 ?我只需要数组“按钮”是唯一的,适合每个对象。

2 个答案:

答案 0 :(得分:5)

这不是原型继承的工作原理,AB具有相同的原型,这意味着它们具有相同的buttons数组。

在JavaScript的继承是原型,你想为每一个“foo”的目的在于,有一个单独的按钮阵列,但所以它是你将它添加到Foo的原型共享遍及其所有实例。

你可以改变这个:

var Foo = function(){
};

Foo = function(){
   this.buttons = []; //add an empty buttons array to every foo element.
};

这将使其工作,另一种方法是首先调用clear方法,它将实例化一个新的buttons数组。

请注意,原型继承主要是关于共享功能而不是属性。您希望每个Foo个实例具有相同的功能,但每个实例都有自己的buttons数组。

一些可以帮助您的资源:

Here is a good tutorial about how the prototypical chain works on MDN

Here is Addy Osmani's (Google) chapter about the constructor pattern来自他的JavaScript模式书

您的代码的其他一些提示:

语法new Array()可缩短为[]。在setIndex中,您实际上并未将索引分配给任何内容。 index也可能在Foo的构造函数中更好地声明。

请注意,当您设置对象的属性时,原型链上存在此类属性,在对象上创建新属性,而不是在原型上修改该属性。

答案 1 :(得分:1)

当您在原型中定义变量时,它将在Foo的所有实例之间共享。您必须在对象(函数)Foo中定义行为,以便为Foo的每个实例创建一个数组实例。