我有一个很好的问题。我需要理解这一点
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()也是如此!!
有没有人能给我解释一下,已经有这个问题了?怎么办?我只需要数组“按钮”是唯一的,适合每个对象。
发布于 2013-03-09 03:33:02
这不是原型继承的工作方式,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 patterns一书
在你的代码中一些其他技巧:
语法new Array()可以缩写为[]。在setIndex中,您实际上并没有将索引分配给任何对象。在Foo的构造函数中声明index可能更好。
请注意,当您在原型链上存在对象的属性时,它会在对象上创建一个新属性,而不是在原型上修改该属性。
发布于 2013-03-09 03:34:35
当您在原型中定义变量时,它将在所有Foo实例之间共享。您必须在对象(函数) Foo中定义行为,以便每个Foo实例都有一个数组实例。
https://stackoverflow.com/questions/15301815
复制相似问题