0

いくつかの例を次に示します。

// case 1:
var obj1 = {msg : 'Hello'};
var obj2 = obj1;
obj2.msg = "Hi!"; //overwrites
alert(obj1.msg); //=>'Hi!'

// case 2:
var obj1 = {msg : 'Hello'};
var obj2 = Object.create(obj1);
obj2.msg = "Hi!"; //does not overwrite
alert(obj1.msg); //=>'Hello'

// case 3:
var obj1 = {data: { msg : 'Hello'}}
var obj2 = Object.create(obj1);
obj2.data.msg = "Hi!"; //overwrites, Why?
alert(obj1.data.msg); //=>'Hi!'

両方を指定すると、両方が同じプロトタイプを指すようになりますObject.create()が、代入は両方のオブジェクトが同じ場所を指すようにします(プロトタイプだけではありません)。 しかし、ケース 3 でデータ オブジェクトが上書きされるのはなぜでしょうか?

4

3 に答える 3

6

浅いコピーのみを作成するためObject.create()、ネストされたオブジェクトは引き続き参照され、深くコピーされません。15.2.3.5 ( Object.create()) および15.2.2.1 ( ) を参照してくださいnew Object()

オブジェクトを完全に複製したい場合は、JavaScript オブジェクトを正しく複製するにはどうすればよいですか? を参照してください。および同様の質問。

于 2013-03-09T08:02:16.197 に答える
4

var obj2 = Object.create(obj1)プロトタイプとしてobj1を使用してempty(!)オブジェクトを作成します。

obj2.msg = "Hi!"プロパティmsgをobj2に追加(!)します。

obj2.data.msg = "Hi!"obj2のプロパティデータを検索しますが、obj2は空です。そのため、obj2のプロトタイプのプロパティデータを探します。これはたまたまobj1です。次に、obj1.dataのmsgを「Hi」に変更します。

于 2013-03-09T11:39:31.607 に答える
0

これは、Java スクリプトがプロパティを設定および取得する方法が原因で発生します。プロパティを取得する場合はプロトタイプ チェーンを検索し、設定する場合は最もローカルなオブジェクトに設定します。

ケース 2 では、それがオーバーライドされない理由です。obj2 で msg プロパティを設定します。ケース 3 では、親オブジェクトのデータ オブジェクトをフェッチし、そこにプロパティを設定します。したがって、オーバーライドされます。ケース 1 では、両方が参照されています。同じオブジェクトに

于 2015-05-23T05:30:40.920 に答える