Javascript 属性在原型中被覆盖
我不是js方面的专家。但最近我开始用原型写作,并面临这样的问题 我有类测试和对象(属性),就像这个类的属性一样。然后创建具有不同属性的实例集合。不幸的是,我得到的集合具有相同的属性,这与最后一个实例属性相同。 我想当你看到代码时会更容易理解Javascript 属性在原型中被覆盖,javascript,Javascript,我不是js方面的专家。但最近我开始用原型写作,并面临这样的问题 我有类测试和对象(属性),就像这个类的属性一样。然后创建具有不同属性的实例集合。不幸的是,我得到的集合具有相同的属性,这与最后一个实例属性相同。 我想当你看到代码时会更容易理解 function Test(id) { this.init(id); } Test.prototype = { attributes : { id : null, }, init : function (id
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);
你能给我解释一下原因吗?我怎样才能避免这个麻烦?
非常感谢原型在
测试的每个实例之间共享。因此,一旦在任何实例中设置了该参数,所有其他实例的该参数也会更改
为了避免这种情况,可以将id设置为实例本身的属性,而不是原型的属性:
功能测试(id){
这个.init(id);
}
Test.prototype={
初始化:函数(id){
this.id=id;
}
};
VarA=[0,1,2,3,4];
对于(a中的var i){
console.log(新测试(a[i]);
}
所有属性都是4((原型在“类”的所有实例之间共享)。如果您希望单个实例具有特定属性,请按每个实例分配它们。this.attributes={}
,而不是prototype.attributes={}
“我有类测试”-JS中没有类。@melpomene:在ES6中有(有点)。或者如果您仍然需要属性
对象,您可以将其添加到“构造函数”(在this.init(id);
)中:this.attributes={id:null};
。甚至this.attributes={id:id};
在init
中。