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() 相同!

谁能解释一下,已经有这个问题了?怎么做 ?我只需要数组“按钮”是唯一的,适合每个对象。

4

2 回答 2

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数组。

一些可以帮助您的资源:

这是一个关于原型链如何在 MDN 上工作的好教程

这是 Addy Osmani (Google) 关于构造函数模式的章节,来自他的 JavaScript 模式书

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

语法new Array()可以缩短为[]. 在setIndex你实际上并没有将索引分配给任何东西。index在构造函数中也可能更好地声明Foo

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

于 2013-03-08T19:33:01.643 回答
1

当您在原型中定义变量时,它会在所有Foo. 您必须在对象(函数)中定义行为,Foo以便为每个Foo.

于 2013-03-08T19:34:34.507 回答