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()相同!!
任何人都可以解释一下这个问题吗?怎么做 ?我只需要数组“按钮”是唯一的,适合每个对象。
答案 0 :(得分:5)
这不是原型继承的工作原理,A
和B
具有相同的原型,这意味着它们具有相同的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
的每个实例创建一个数组实例。