属性 在 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"}