Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 属性在原型中被覆盖_Javascript - Fatal编程技术网

Javascript 属性在原型中被覆盖

Javascript 属性在原型中被覆盖,javascript,Javascript,我不是js方面的专家。但最近我开始用原型写作,并面临这样的问题 我有类测试和对象(属性),就像这个类的属性一样。然后创建具有不同属性的实例集合。不幸的是,我得到的集合具有相同的属性,这与最后一个实例属性相同。 我想当你看到代码时会更容易理解 function Test(id) { this.init(id); } Test.prototype = { attributes : { id : null, }, init : function (id

我不是js方面的专家。但最近我开始用原型写作,并面临这样的问题

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

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
中。