【问题标题】:Property shared between classes in javascriptjavascript中类之间共享的属性
【发布时间】:2015-03-29 09:05:15
【问题描述】:
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 属性应该为空。

【问题讨论】:

  • 你可能想在构造函数中声明它,比如this.stuff = {}
  • 原型是共享的,只有一个东西的实例,当变异时它会针对所有实例发生变化。这里详细解释:stackoverflow.com/a/16063711/1641941

标签: javascript node.js class object


【解决方案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"}

【讨论】:

  • 一旦你开始掌握原型继承的工作原理,它就不会那么违反直觉了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 2018-10-14
相关资源
最近更新 更多