属性在原型中被覆盖

时间:2016-06-17 16:11:22

标签: javascript

我不是js的专家。但最近我开始用原型编写并面对这样的问题。

我有类Test和对象(属性),就像这个类的属性一样。然后我创建具有不同属性的实例集合。不幸的是,我得到了具有相同属性的集合,这些属性与最后的实例属性相同。 我想你看到代码时会更容易理解。

function Test(id) {
   this.init(id);
}

Test.prototype = {
    attributes : {
        id : null,
    },

    init : function (id) {
        this.attributes.id = id;
    }
};

var a = [0, 1, 2, 3, 4];
var b = {};


for(var i in a) {
    b[i] = new Test(a[i]);
}

console.log(b);

this result I have

你能解释一下我的原因吗?我该如何避免这种麻烦? 非常感谢

1 个答案:

答案 0 :(得分:2)

原型在Test的每个实例之间共享。因此,一旦在任何实例中设置了它,它也会针对所有其他实例进行更改。

为避免这种情况,您可以将id设为实例本身的属性,而不是原型的属性:

function Test(id) {
    this.init(id);
}
    
Test.prototype = {
    init : function (id) {
        this.id = id;
    }
};
    
var a = [0, 1, 2, 3, 4];      
    
for(var i in a) {
    console.log(new Test(a[i]));
}
    

通过不将id声明为原型的属性,默认情况下将其视为实例的属性。