2017-03-09 5 views
0

JS의 프로토 타입 상속과 관련된 프로젝트에서 한 가지 문제가 발생했습니다. 그리고 추상적 주요 문제로 다음javascript : 프로토 타입 상속에 대한 혼란스러운 점

var parentObj = { 
    value:"parent value", 
    obj: { 
     obj: "parent obj value" 
    } 
} 

var childObj = Object.create(parentObj) 

리터럴 객체 방법으로 parentObj을 만들고, 그것을 기반으로 childObj를 작성하고 프로토 타입을 만든다.

및 제 경우

다음과 같이

childObj.value ="child value" 
childObj.obj = {obj:"child obj value"}; 
console.log(parentObj) 
console.log(childObj) 

출력은 예상대로

{ value: 'parent value', obj: { obj: 'parent obj value' } } 
{ value: 'child value', obj: { obj: 'child obj value' } } 

이 결과 간다.

그러나 후자의 경우에 대해서는 다음과 같은

:

childObj.value ="child value" 
childObj.obj.obj = "child obj value"; 
console.log(parentObj); 
console.log(childObj); 

출력은 :

{ value: 'parent value', obj: { obj: 'child obj value' } } 
{ value: 'child value' } 

parentObj가 변경되었다. 이 결과는 나에게 조금 혼란 스럽다.

+0

나는 그것이 자식 개체 만 "아이 OBJ 값"을 반환 생각하는 것이 좋습니다. 다시 한번 확인해 주시겠습니까? 또는 childObj .__ proto__를 확인하면 parentObj가 표시됩니다. – Nitesh

+0

@ Nitesh, 내가 게시 한 결과를 확인했습니다. –

+0

'childObj.obj' 속성을 읽으면 프로토 타입 상속을 사용하고'parent.obj'를 얻습니다. 이 시점에서,'childObj.obj'와'parentObj.obj'는 같은 객체에 대한 참조이므로, 두 객체 모두에서 그 객체에 대한 수정을 볼 수 있습니다. –

답변

0

x = Object.create(y)을 사용하는 경우 xy의 개체를 __proto__ 속성으로 사용합니다.

__proto__은 JS에서 속성 위임을 허용합니다.

속성 위임은 개체에 속성을 요청할 때 개체에 해당 속성이 없으면 부모 (__proto__)에게 물어 보게됩니다. 그리고 부모 객체가 가지고 있지 않다면 부모 객체에게 물어볼 것입니다.

체인이 다 떨어지기 전에 값이 발견되면 반환되고, 그렇지 않으면 undefined이 반환됩니다. 귀하의 경우

var parentObj = { 
    value:"parent value", 
    obj: { 
     obj: "parent obj value" 
    } 
} 

var childObj = Object.create(parentObj) 

parentObj에서


childObj하지가 자신의 특성 .obj 또는 .value 이름을 가지고, 또한

console.log(childObj.__proto__ === parentObj) // true 

childObj__proto__입니다. Object.getOwnPropertyNames을 사용하여이를 확인할 수 있습니다. 속성이 개체에 있는지 여부를 확실히 알 수있는 유일한 방법입니다.

console.log(Object.getOwnPropertyNames(parentObj)) // ["value", "obj"] 
console.log(Object.getOwnPropertyNames(childObj)) // [] 

당신이 childObj.obj.obj = ...

, 당신은 객체 parentObj.obj에 재산 .obj을 수정합니다.

반대로 childObj.obj = ...을 입력하면 .obj이라는 새 속성을 childObj에 추가합니다.

childObj.obj = "child obj value" 
console.log(Object.getOwnPropertyNames(childObj)) // ["obj"] 

PS : 당신이 했나 주제에 대해 더 알아 보려면, 나는 http://www.javascripttutorial.net/javascript-prototype/