我正在查看有关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不应该有值吗?我如何更改示例以使输出符合预期?
答案 0 :(得分:2)
您无意中将varB
指定为不可写,因此作业this.varB = b
失败(或被忽略)。
writeable: true
拼写为writable: true
(不含e
)。默认情况下,使用a属性描述符定义的属性是不可写的。
所以整个描述符变为:
varB: { value: null, enumerable: true, configurable: true, writable: true }
因为你在构造函数中分配了一个值,所以你实际上不必使用描述符。