プロトタイプの仕組みを理解しようとしています。なぜ次のことが壊れているのですか?オブジェクトのプロトタイプを切り替える
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? :(
プロトタイプの仕組みを理解しようとしています。なぜ次のことが壊れているのですか?オブジェクトのプロトタイプを切り替える
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? :(
私はあなたが最後の行aa.hi
の代わりaa.hello
で意味だと思います。
A.prototype
は、新しいオブジェクト(aa
)がすでに作成されている後を割り当てられているので、それはあなたにundefined
を与えます。あなたの2行目
:
//...
aa = new A;
//...
これはA.prototype
はObject.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"
1を、それをしない - 可能性があります新しいオブジェクトを割り当てるのではなく、OPがプロトタイプにプロパティを追加した場合、 'aa.hi'は' 'hello" 'を返します。 –
ありがとう!私は内部[[Prototype]]について知らなかった。内部のコンストラクタもそうですか? – John
woopsを、 – John
削除挨拶をaa.hiする補正をした:「事前に感謝を!」、次回 –