在javascript中的类之间共享的属性

时间:2015-01-29 23:21:36

标签: javascript node.js class object

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属性应为空。

1 个答案:

答案 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"}