0

誰かがここで何が起こっているのか説明してもらえますか? ありがとう。

var o = {a:1};
var p = o;
o === p; // true;
o = Object.create(o);
p === o; // false
o.b = 2;
o.a; // 1
b.a; // 1
o.b; // 2
p.b; // undefined

どうしたの?特にL4。o現在のスコープで、割り当ての RHS の値に割り当てています。ここで、o は引き続き L1 で作成された元のオブジェクトを指しています。では、Object.create は変数とはまったく関係なく、オブジェクト自体にラッチされていますか?

4

4 に答える 4

3
var o = {a:1};
var p = o;

これまでのところ、1 つのオブジェクトとそれを指す 2 つの変数があります。

o = Object.create(o);

oこの行は、によってプロトタイプ化された新しい (空の) オブジェクトにvariable を再割り当てしますo

以前のオブジェクト (現在oは のプロトタイプ) は、まだ によって参照されていpます。

フィールドの読み取りは次のようになります。

o.a; // 1 - found in o's prototype (p)
b.a; // 1 - you probably meant p.a? found in p directly
o.b; // 2 - found in o directly
p.b; // not found in p or anywhere in p's prototype chain
于 2013-11-15T08:55:02.900 に答える
2
// create a new object and assign it to o
var o = {a:1};

// assign the value of o to the variable p
var p = o;

// o equals p because both variables refer to the same object
o === p; // true;

// create a new object which uses the existing object o as prototype
// overwriting the current value of o with the new object
// It's essentially the same as
// var tmp = {};
// tmp.__proto__ = o;
// o = tmp
o = Object.create(o);

// o and p refer to two different objects now
p === o; // false

// A new property is added to the object o
o.b = 2;

// inherited from the object that o originally referred to
o.a; // 1

// b is not defined anywhere (you probably meant p)
// p still refers to the object created in the first step
b.a; // 1

// the property b was assigned to the new object through o.b = 2
o.b; // 2

// the original object doesn't have a property b
p.b; // undefined
于 2013-11-15T08:58:06.377 に答える
1

DeepCopyとShallowCopyの違いを示す例です

オブジェクトは参照型です。オブジェクトxを作成するとき、xはオブジェクトが実際にあるメモリのみを指すことを意味します(0x0003f3など)

デフォルトでは、参照された型付きオブジェクトの割り当て (例: オブジェクト x = a) は浅いです。つまり、o と p のように参照された型付きオブジェクトが 2 つある場合、割り当て p == 0 を実行すると、両方の値が同じオブジェクトを参照します。代入はメモリオフセットのみをコピーし、実際のオブジェクトはコピーしません

は、「p」で行ったすべての変更が「o」にも反映されることを意味します。o == p はどちらも同じポインタを保持しているため True です。

4 行目: o は別のオブジェクトを指しており、残りは "o" への変更が "p" に反映されないことを示しています。これは、メモリ内の同じオブジェクトを指していないためです。

于 2013-11-15T08:59:48.563 に答える