2

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

4

1 に答える 1

2

誤って書き込み不可varBとして指定したため、割り当てが失敗しました (または無視されました)。this.varB = b

writeable: truewritable: true(なしで)スペルする必要がありますe。デフォルトでは、プロパティ記述子を使用して定義されたプロパティは書き込み不可です。

したがって、記述子全体は次のようになります。

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

とにかくコンストラクター関数内で値を代入しているので、記述子を実際に使用する必要はありません。


詳細: MDN -Object.defineProperty .

于 2013-01-20T21:15:49.137 に答える