javascript - 原型(prototype)对象的数组

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

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

最佳答案

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

在 JavaScript 中,继承是典型的,您希望每个“Foo”对象都有一个单独的按钮数组,但您要将它添加到 Foo 的原型(prototype)中,所以它是 在其所有实例之间共享

你可以改变这个:

var Foo = function(){
};

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

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

请注意,原型(prototype)继承主要是关于共享功能,而不是属性。您希望每个 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 的构造函数中声明。

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

关于javascript - 原型(prototype)对象的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15301815/

相关文章:

php - 如何对多行结果的 json 进行编码?

c++ - 包含类对象的最佳 C++ 设计是什么?

javascript - JSON 中的未定义值

javascript - 在特定索引处插入字符串

javascript - Vuex(或者可能只是 JS)在 Actions 和 context/commit 中链接 promise

javascript - 在 Angular JS 中使用移动 View 时,表格单元格中不会发生文本对齐

来自存储在数据库中的数组的php输出复选框然后显示选中如果选中

iphone - iOS —将方法映射到数组

javascript 使用函数的方法创建对象的更好方法

python sqlAlchemy : got InvalidRequestError after change class location