Javascript继承。为什么我的类共享嵌套的成员数据?

时间:2015-05-01 15:53:09

标签: javascript

我在使用Crockfords书中读到的以下继承代码时遇到了困难。

当我创建Column对象的两个实例时,“this.name”成员数据在每个实例中都是不同的,正如我所期望的那样。

但是,当我使用嵌套成员数据“this.model.name”时,它总是在实例之间共享。

有人可以建议一种解决方法吗?

var BaseColumn = function() {
   this.model = {};
   this.model.name = "";
   this.name="";
};

var Column = function (name) {
   this.model.name = name;
   this.name = name;
};

Column.prototype = new BaseColumn();

var col1 = new Column("Column1");
var col2 = new Column("Column2");

alert(col1.name);          //Returns "Column1"
alert(col2.name);          //Returns "Column2"
alert(col1.model.name);    //Returns "Column2"
alert(col2.model.name);    //Returns "Column2"

2 个答案:

答案 0 :(得分:2)

James Wilkins提供的答案是正确的。只创建了BaseColumnColumn个实例,Column.prototype通过 var BaseColumn = function() { this.model = {}; this.model.name = ""; this.name = ""; }; var Column = function(name) { // Call the parent's constructor, a new model object will be created // instead of using a shared one from the prototype BaseColumn.apply(this); this.model.name = name; this.name = name; }; Column.prototype = Object.create(BaseColumn.prototype); var col1 = new Column("Column1"); var col2 = new Column("Column2"); console.log(col1.name); //Returns "Column1" console.log(col2.name); //Returns "Column2" console.log(col1.model.name); //Returns "Column1" console.log(col2.model.name); //Returns "Column2"

的所有实例共享了该实例

但是,值得注意的是,您建立继承的方式是不正确的。没有必要仅仅为了设置继承来实例化父对象,而是需要从构造函数中调用父对象的构造函数。

有关详细信息,请参阅http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.htmlhttp://js-bits.blogspot.com/2014/10/understanding-prototypical-inheritance.html上的帖子

以下示例正常。



VirtualApplication




答案 1 :(得分:0)

答案很简单:{}由JS解析一次,并引用您创建的每个实例中的相同对象。要为每个实例创建一个新的不同对象,只需执行类似

的操作
this.model = Object.create();

this.model = new Object();

this.model = function() { return {}; }();

但是,如何设置继承还存在其他问题,其他答案可能会对您有所帮助。