0

重複の可能性:
プロトタイプ コンストラクターを設定する必要があるのはなぜですか?

階層を構築するときに、javascript オブジェクトの「コンストラクター」プロパティをサブクラスに設定する必要性を理解するのに苦労しています。以下のコードは、コンストラクターのプロパティを変更せずに期待されることを実行することがわかりましたが、ほとんどすべての参考文献で、コンストラクターが明示的に設定されています。何か不足していますか?(ECMAScript 仕様でも明示的な使用は見当たりません)。

A = function() {
    this.value = "a";

    this.A = function() {
        window.alert( this.value + " instanceof A : " + ( this instanceof A ) );
    }
}


B = function() {
    this.value = "b";

    this.B = function() {
        window.alert( this.value + " instanceof B : " + ( this instanceof B ) );
    }
}

B.prototype = new A();

test = function() {
    var b = new B();
    b.A();
    b.B();
}
4

1 に答える 1

1

まず、適切なJS継承とは、プロトタイプにメソッドを配置することを意味します。

var A = function() {
    this.value = "a";
};

A.prototype.A  = function() {
        window.alert( this.value + " instanceof A : " + ( this instanceof A ) );
};

var B = function() {
    this.value = "b";
};

次に、プロトタイプチェーンを確立するときにコンストラクターを実行しないでください。

B.prototype = Object.create( A.prototype );

全体を再割り当てすると.prototype、オブジェクトが完全に上書きされます。したがって、コンストラクタープロパティを再割り当てする必要があります(使用する場合)。

B.prototype.constructor = B;

B.prototype.B = function() {
    window.alert( this.value + " instanceof B : " + ( this instanceof B ) );
};

Object.create古いブラウザではサポートされていませんが、次のようなことができます。

Object.create = Object.create || function( proto ) {
     if( proto == null ) {
         return {};
     }
     function f(){}
     f.prototype = proto;
     return new f();
};
于 2012-11-24T13:55:23.723 に答える