2013-03-08 67 views
2

我在这里有一个很好的问题。我需要了解这个原型对象的数组

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()一样!

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

回答

5

这不是典型的是如何继承的作品,AB具有相同的原型,这意味着它们具有相同的buttons阵列。

在JavaScript中继承为原形,你想是每个“富”的对象有一个单独的按钮排列,但因此它在其所有实例共享你将它添加到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

知识缺失!非常感谢你 – Flozza 2013-03-08 19:51:07

1

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