2016-12-24 14 views
4

JSのプロトタイプについて私に混乱を招くことがあります。Javascriptプロトタイプの継承とObject.create()?

のは、私がこのようなオブジェクトがあるとしましょう:今すぐ

let a = { 
 
    b: 1 
 
};

を、私は「A」の性質を継承する別のオブジェクトを作成したいです。

let obj = Object.create(a);

したがって、このような状況では、私がのObject.prototypeにリンクします 'A' のプロトに私の "objののプロトをリンクします。最初の質問は、objのリンクを削除するかどうかです。 プロトタイプをaで置き換えます。 proto

今度は私が行うと仮定してみましょう:

a = 2;

私はそれが '' メモリに彼の参照を削除更新思うだろう。だから、

今私がしなければ:

a.isPrototypeOf(obj)

それは論理的にを返します。しかし、変わった 'obj'はまだプロパティbを指し、それにアクセスすることができます(obj.b print 1)。それを超えた芸術主義は何ですか?

+0

bはobjのプロトタイプにコピーされていますので、もう必要はありません。 –

答えて

0

技術的には、オブジェクトを別の新しい値に置き換えると、オブジェクトの古い参照が変数から切り捨てられます。しかし、リンクされた変数がなくなるまではまだ生き残ります。

var x = { a:10 } 
var y = { x }; 
x = 10; 

ここで、yはプロパティーxで値10を保持するとみなされます。しかし、これはそうではありません。上で述べたように、xの古いメモリ位置は、ゴミが収集されるまで生き続けるでしょう。同時に、xは新しい値の新しいメモリ位置に割り当てられます。

あなたのケースでは、他の値を置き換えて、aの参照を失うだけです。したがって、aの値を置き換えた後は、どこでもisPrototypeOf(obj)を使用することはできません。

+0

あなたの返信をありがとう。どうすれば 'a'プロパティを削除できますか?あなたの例で "delete y.a"を使用すると、 'a'はyの独自のプロパティではないので何もしません。 – musecz

+0

@musecz明らかに、それはそれを削除しません。 'y.a'は未定義になるからです。 'delete y.x.a'で削除することができます –

+0

私は"未定義またはヌルをオブジェクトに変換できません "ということを試してみます - xはyへの実際の参照ではないので – musecz

関連する問題