function myclass(){
}
myclass.prototype = {
stuff: {},
getStuff: function(){
return Object.keys(this.stuff).length;
}
};
var m1 = new myclass();
m1.stuff[5] = 'test';
m1.stuff[6] = 'test';
var m2 = new myclass();
m2.stuff[12] = 'test';
m2.stuff[14] = 'test';
alert(m2.getStuff()); // 4 instead of 2 ?!
有人可以解释为什么警报打印4?
如果我创建了我的函数的新实例,那么stuff属性应为空。
答案 0 :(得分:1)
你在这里所做的一般被认为是不好的做法。您不想覆盖原型,但想要添加原型。
现在问题的核心。您将stuff
定义为原型的属性。这意味着使用该原型创建的任何对象都将共享该对象。如果您希望每个实例拥有它自己的stuff
,则它需要是一个实例变量:
function myclass(){
this.stuff = {};
}
myclass.prototype = {
getStuff: function(){
return Object.keys(this.stuff).length;
}
};
但就像我说的那样,不要重新定义原型,加上它:
function myclass(){
this.stuff = {};
}
myclass.prototype.getStuff = function(){
return Object.keys(this.stuff).length;
}
现在,添加到stuff
的任何内容都只会添加到该特定实例中:
var foo = new myclass();
foo.stuff.thing = "Hey, I'm foo";
var bar = new myclass();
bar.stuff.thing = "Hey, I'm bar";
console.log(bar.stuff); //{thing: "Hey, I'm bar"}