我在使用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"
答案 0 :(得分:2)
James Wilkins提供的答案是正确的。只创建了BaseColumn
个Column
个实例,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.html和http://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 {}; }();
但是,如何设置继承还存在其他问题,其他答案可能会对您有所帮助。