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 には値が必要ではありませんか? 出力が期待どおりになるように、例をどのように変更する必要がありますか?