2013-03-09 1 views
0

다음은 몇 가지 예입니다. 할당이 동일한 위치 (그냥 프로토 타입)을 모두 객체 포인트를 만드는 동안 나는 Object.create() 생각Object.create() 사용과 대입 연산자 사용의 차이점은 무엇입니까?

// 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!' 

은, 모두 같은 프로토 타입 두 지점을 만들어 준다. 그렇다면 왜 데이터 오브젝트는 케이스 3에서 덮어 쓰여 집니까? 만 단순 복사본을 만듭니다 Object.create() 때문에

답변

4

var obj2 = Object.create(obj1)은 obj1을 프로토 타입으로 사용하여 빈 (!) 객체를 만듭니다.

obj2.msg = "Hi!"은 msg 속성에 obj2를 추가합니다 (!).

obj2.data.msg = "Hi!"은 obj2에서 속성 데이터를 찾지 만 obj2는 비어 있습니다. 따라서 obj2의 프로토 타입에 대한 속성 데이터를 찾습니다.이 데이터는 obj1이됩니다. 그런 다음 obj1.data의 msg를 "Hi"로 변경합니다.

5

가 중첩 된 객체가 여전히 참조 깊이 복사되지 않습니다, 15.2.3.5 (Object.create())와 15.2.2.1 (new Object())를 참조하십시오.

개체를 완전히 복제하려면 How do I correctly clone a JavaScript object? 및 비슷한 질문을보십시오.

+0

프로토 타입 속성을 설정할 때 문자열이나 숫자와 같은 간단한 값인 경우 프로토 타입이 아닌 객체 자체에 설정되지만, 기존 객체 또는 배열 속성을 수정하면 프로토 타입의 속성이 변경됩니다. 구별을 이해하는 것이 중요합니다. 왜냐하면 상속을 올바르게 수행하는 데 영향을 미치기 때문입니다. 자세한 내용은 http://www.bennadel.com/blog/1566-Using-Super-Constructors-Is-Critical-In-Prototypal-Inheritance-In-Javascript.htm을 참조하십시오. –

0

자바 스크립트가 프로퍼티를 설정하고 가져 오는 방식 때문에 발생합니다. 프로퍼티를 얻으려면 프로퍼티 체인을 찾습니다. 설정하는 동안 가장 많은 로컬 오브젝트에서 설정합니다.

케이스 2에서는 오버라이드하지 않습니다. msg 속성을 obj2.In으로 설정합니다. 케이스 3 부모 개체의 데이터 개체를 가져 와서 거기에 속성을 설정합니다. 재정의됩니다. 사례 1 그들은 모두 동일한 객체를 참조합니다