2009-07-30 5 views
5

私はここに、スーパークラスA 私のコードを継承するサブクラスBを作成したい:JavaScriptのオブジェクトのサブクラス

function A(){ 
    this.x = 1; 
} 

B.prototype = new A; 
function B(){ 
    A.call(this); 
    this.y = 2; 
} 
b = new B; 
Console.log(b.x + " " + b.y); 

それを実行すると、それはBが未定義であることを示しています。

答えて

7
B.prototype = new A; 
function B(){ 
    A.call(this); 
    this.y = 2; 
} 

function B(){ 
    A.call(this); 
    this.y = 2; 
} 
B.prototype = new A; 
+0

ありがとうございます。 –

+3

より先に –

+7

お返事ありがとうございます –

17

する必要がありますあなたは、そのプロトタイプにアクセスしようとする前にBのコンストラクタ関数を定義する必要があります。

function A(){ 
    this.x = 1; 
} 

function B(){ 
    A.call(this); 
    this.y = 2; 
} 

B.prototype = new A; 

b = new B; 
console.log(b.x + " " + b.y); // outputs "1 2" 
5

Lynda.comは、あなたが次のBにコンストラクタを再割り当てすることをアドバイスし、次のように。標準のクラスの導出に

function B() { 
    A.call(this); 
    this.y = 2; 
} 

B.prototype = new A; 
B.prototype.constructor = B; 
+0

詳細はこちら?コンストラクタが既に再割り当てされていない限り、 'b = new B'は成功しなかったようです。しかし、すでに再割り当てされている場合は、なぜ2行目に明示的に再割り当てする必要がありますか? –

+0

Lynda.comとはどのようになり、彼らは何を気にしますか? (私は彼らの言うことに同意するが、それは私が言いたいことではない) – LeeGee

1

、新しく作成された基本クラスのインスタンス(B.prototype =新しいA)に由来するのほぼ普遍的な間違いがあります。最低でも基本クラスのコンストラクタは不要なコードを実行し、最悪の場合、派生のために人工的に作成する必要のない入力引数がなくてもクラッシュする可能性があります。さらに、基本クラスインスタンスのインスタンス関数は、純粋な運のみによって適切な派生クラスプロトタイプの一部になります。

クリアしてください!基本クラスのコンストラクタ(B.prototype = new A)によって作成された基本クラスのインスタンスを継承した場合、基本クラスから直接継承することはありません!!継承チェーン、つまり基本クラスインスタンスに仲介を作成しました!うん!!これは、継承チェーン内の継承されたプロパティ値を探す際に余分な深さがあるため、非効率的です。この深さは、この間違いを犯すたびに累積されます。

だから正しい方法です。 B.prototype = new Aの代わりに、 B.prototype = Object.create(A.prototype)を記述する必要があります。 09年には利用できなかったかもしれませんが、09年にはまだObject.createの代わりに

protoProxy = function(myClass) 
{ 
    function foo(){}; 
    foo.prototype = myClass.prototype; 
    return new foo(); 
} 

がありました。 B.prototype = newの代わりに と書くべきです。B.prototype = protoProxy(A)を09に書いてください。

関連する問題