2010-12-30 12 views
4

プロトタイプの仕組みを理解しようとしています。なぜ次のことが壊れているのですか?オブジェクトのプロトタイプを切り替える

var A = function A(){this.a = 0}, 
    aa = new A; 

A.prototype = {hi:"hello"}; 

aa.constructor.prototype //->{hi:"hello"} ok so far :) 

aa.hi //undefined?? why? :(
+1

woopsを、 – John

+0

削除挨拶をaa.hiする補正をした:「事前に感謝を!」、次回 –

答えて

12

私はあなたが最後の行aa.hiの代わりaa.helloで意味だと思います。

A.prototypeは、新しいオブジェクト(aa)がすでに作成されている後を割り当てられているので、それはあなたにundefinedを与えます。あなたの2行目

//... 
aa = new A; 
//... 

これはA.prototypeObject.prototypeから継承するシンプルな空のオブジェクト、です、この時点で、A.prototypeから継承したオブジェクトを作成します。

このオブジェクトは、aaオブジェクトインスタンスの内部[[Prototype]]プロパティによって参照されたままになります。

この後にA.prototypeを変更すると、aaとそのオブジェクト間の直接継承関係は変更されません。

実際に[[Prototype]]の内部プロパティを変更する標準的な方法はありません。一部の実装では、__proto__という非標準プロパティを使用してアクセスできます。

しようと、期待どおりの結果を得るために:

var A = function A() { this.a = 0 }; 
A.prototype = { hi:"hello" }; 

var aa = new A; 

aa.hi; // "hello" 
+3

1を、それをしない - 可能性があります新しいオブジェクトを割り当てるのではなく、OPがプロトタイプにプロパティを追加した場合、 'aa.hi'は' 'hello" 'を返します。 –

+0

ありがとう!私は内部[[Prototype]]について知らなかった。内部のコンストラクタもそうですか? – John