gpt4 book ai didi

javascript - 重访 MDN JavaScript 继承 - 理解示例

转载 作者:行者123 更新时间:2023-11-29 22:17:15 24 4
gpt4 key购买 nike

我正在查看 MDN 页面上关于 Inheritance Revisited 的示例并认为让doSomething 方法实际 某事会很好。因此,我根据示例开始使用以下代码:

function A(a) { this.varA = a };
A.prototype = { varA: null, doSomething: function() { console.log('do something with ' + this.varA) } };
function B(a, b) {
A.call(this, a);
this.varB = b;
};
B.prototype = Object.create(new A(), {
varB: { value: null, enumerable: true, configurable: true, writeable: true },
doSomething: { value: function() {
A.prototype.doSomething.apply(this, arguments);
console.log("do something with " + this.varB);
}, enumerable: true, configurable: true, writeable: true}
});
var b = new B('a', 'b');
b.doSomething();

我将代码复制并粘贴到 Chrome 控制台中,预计会看到

do something with a
do something with b

但是我得到了

do something with a
do something with null

我在这里忽略了什么?调用“new B”不应该导致调用上面定义的构造函数(函数 B(...))吗?如果构造函数被调用,b.varB 不应该有值吗?我需要如何更改示例以使输出符合预期?

最佳答案

您不小心将 varB 指定为不可写,因此赋值 this.varB = b 失败(或被忽略)。

writeable: true 应该拼写为 writable: true(没有 e)。默认情况下,使用属性描述符定义的属性是不可写的。

所以整个描述符变成:

varB: { value: null, enumerable: true, configurable: true, writable: true }

因为无论如何您都是在构造函数内部赋值,所以您实际上不必使用描述符。


更多信息:MDN - Object.defineProperty .

关于javascript - 重访 MDN JavaScript 继承 - 理解示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14428932/

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