gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:33:37 25 4
gpt4 key购买 nike

我在阅读 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"

最佳答案

这是因为 Column 的每个实例将引用相同的 model原型(prototype)中的对象。创建第二个 Column覆盖 model.name 的先前值.

让我们更仔细地查看您的代码,看看您为什么会得到现在的结果:

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

这创建了一个类型 BaseColumn将创建属性的构造函数 modelname使用 new 调用时在新对象上.

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

这创建了一个类型 Column将失败的构造函数。如果您调用 new Column()现在,它将在 this.model 上失败(此时)。

Column.prototype = new BaseColumn();

这会将现有原型(prototype)替换为从 BaseColumn 的新实例创建的新原型(prototype).这个对象包含我上面提到的这个类型的属性,属性值将在所有 Column 之间共享。对象。为什么?因为如果本地 Column实例( col1col2 )不包含属性,原型(prototype)链会被搜索一个。由于所有Column实例共享相同的原型(prototype),它们最终都引用相同的值。

var col1 = new Column("Column1");

你知道吗,此时,Column.prototype.model.name == "Column1"

var col2 = new Column("Column2");

Column.prototype.model.name现在是“Column2”`。你看,原型(prototype)不是重复的。它是共享的。

如果希望每个实例都有一个模型,则必须构建一个新的 model每个新的对象 Column .

为了更好地处理继承,请查看 Juan Mendes 的答案.在此模式中,您从子类型的构造函数中显式调用基类构造函数。这将添加/构造基本属性,并且应该放在子类型的构造函数的顶部(通常)。

关于Javascript 继承。为什么我的类共享嵌套成员数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29990316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com