重新审视MDN JavaScript继承 - 理解示例

时间:2013-01-20 20:29:47

标签: javascript

我正在查看有关Inheritance Revisited的MDN页面上的示例,并认为让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不应该有值吗?我如何更改示例以使输出符合预期?

1 个答案:

答案 0 :(得分:2)

您无意中将varB指定为不可写,因此作业this.varB = b失败(或被忽略)。

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

所以整个描述符变为:

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

因为你在构造函数中分配了一个值,所以你实际上不必使用描述符。


更多信息:MDN - Object.defineProperty