属性 在 javascript 中的 类 之间共享
Property shared between classes in javascript
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
定义为原型的属性。这意味着使用该原型创建的任何对象都将共享该对象。如果你想让每个实例都有自己的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"}
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
定义为原型的属性。这意味着使用该原型创建的任何对象都将共享该对象。如果你想让每个实例都有自己的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"}