2012-01-18 24 views
0

これは私の最初の投稿です!私はjavascriptの継承に関する簡単な質問があります。拡張機能を使用して

もちろん、 'extend2'メソッドは、for-inループを使用して親オブジェクトから子オブジェクトを継承するために使用されます。

var extend2 = function (child, parent) { 
    var c = child.prototype; 
    var p = parent.prototype; 
    for (var i in p) { 
     c[i] = p[i]; 
    } 
} 

私は現在Stoyan Stefanovの "Object Oriented Javascript"を読んでいます。それは素晴らしい本です。

子供のプロトタイプオブジェクトが完全に上書きされたり置き換えられたりすることはありませんが、それは単に拡張されたものです。

オブジェクトが継承すると、extend2関数を使用して参照として参照するのではなく、プリミティブデータ型をコピーします。

これは本当にありがとうございます!

+0

あなた 'extend2'が動作していませんStoyansとして。彼は両親**プロトタイプ**を反復し、すべてのプロパティを子**プロトタイプ**にコピーする(sic)。親プロトタイプを反復処理している間は、プロトタイプではなく、オブジェクト自体からプロパティをアクセスし、オブジェクトにコピーしようとします。 – bennedich

+0

私の間違いは、私のコードを再編集します。 – user1120327

答えて

0

JavaScriptのプリミティブデータ型は、参照ではなく値を介して渡されます。したがって、値をコピーすると、それを参照するのではなく、実際にコピーしています。 伝統的にこれはプリミティブが文字通りそのような方法でメモリにエンコードされていたからです(プリミティブint7は0x7としてメモリにエンコードされます)。しかし、オブジェクトを扱うときは、したがって、値をコピーすると、ポインタを参照するオブジェクトではなく、単に参照ポインタのコピーになります。

子のプロトタイプが置き換えられないという事実は、 。

オブジェクトのインスタンスが0と呼ばれるフィールドを初期化することを示すことになる
{ 
    someField: 5 
} 

:Javaでプロトタイプは、単に他の目的であるので、プロトタイプは次のようになります。の値は5です。上記のコードでは、オブジェクトの各エントリは子プロトタイプにコピーされますが、何も削除されません。子供のプロトタイプがどのように見える場合はこのように:

{ 
    someField: 10 
    someOtherField: 3 
} 

そして、上記extend2コマンドを実行すると、someFieldを上書きしますが、someOtherFieldないので、結果のプロトタイプは次のようになります:

{ 
    someField: 5 
    someOtherField: 3 
} 
関連する問題