gpt4 book ai didi

javascript - 将 JS 原型(prototype)设计和 OOP 与实例变量混淆

转载 作者:行者123 更新时间:2023-11-29 10:14:57 25 4
gpt4 key购买 nike

所以我想说我对 JavaScript 的理解还算不错,但似乎这门语言总是喜欢对我施加压力。我对 JS 对象的“实例”变量的行为有疑问(也许不是问题,但肯定会混淆)。让我们看看下面的代码

function A(a) {
this.a = a;
this.b = [];
}
function B(a) {
//A.apply(this, arguments);
this.a = a
}
B.prototype = new A();
B.prototype.constructor = B;
B.prototype.append = function(b) {
this.b.push(b);
};

var one = new B("one");
var two = new B("two");
console.log(one.a);
console.log(two.a);
one.append(10);
console.log(one.b);
console.log(two.b);

如果运行此代码,您将看到 one.btwo.b 共享相同的 b“实例”变量大批。我只注意到这种情况发生在阵列上。我知道如果这是 A.prototype.b = [],它肯定会在 A 或其子项的所有实例之间共享。我不明白的是它是用“this”命令定义的,这意味着它应该是每个实例。有趣的是,如果您取消注释 A.apply(this, arguments)(有效地在父级上调用 super)并删除 中的 this.a = a >B 构造函数,它会像你想象的那样工作。有谁知道发生这种情况的原因吗?

最佳答案

你在做 B.prototype = new A(); 这等同于

B.prototype.a = undefined;
B.prototype.b = [];
// or actually
// B.prototype = {a: undefined, b: []};

这就是共享数组的来源。

您没有为 B 的每个实例调用 A 构造函数。取消注释 A.apply(this, arguments); 行,它将按预期工作。

参见 Benefits of using `Object.create` for inheritance以获得更好的继承方式。

关于javascript - 将 JS 原型(prototype)设计和 OOP 与实例变量混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268440/

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