2017-11-04 16 views
1

우리가 알다시피, 우리는 객체의 속성에 접근하려고 할 때 객체가 자신의 속성을 가지고 있는지 먼저 확인합니다. 찾지 못하면 프로토 타입을 탐색하여 프로토 타입 체인을 검사합니다. 질문에 오는객체가 값을 얻기 위해 프로토 타입 체인을 트래버스하지 않는 경우가 있습니까?

, 위의 조각, 첫 번째 CONSOLE.LOG 문에서 아래의 코드 (http://jsbin.com/mabajidoti/edit?js,console)

function CT() {} 
CT.prototype.myValue = 4; 
var myObj = Object.create(CT); 

console.log(myObj.myValue);   //logs undefined 
console.log(myObj.prototype.myValue) //logs 4 

을 확인하시기 바랍니다 myObj.myValue는 myValue가에서 사용할 수있는 경우에도 정의되지 않은 반환의 prototype (두 번째 console.log 문)? myValue의 값을 가져 오기 위해 프로토 타입 체인을 통과해서는 안됩니까?

+0

'CT.prototype'가 프로토 타입으로 사용하여 CT 클래스를 참조 new Obj()

첫 페이지의 배열과 OBJ를 만들 때 obj.prototypeName와 프로토 타입에 액세스 할 수 있습니다 'CT'의 새로운 사례들. 'Object.create (CT);는'CT' 자체를 프로토 타입으로하여 새로운 객체를 생성합니다. 'CT.prototype'을 프로토 타입으로 만들고 싶다면'Object.create (CT.prototype)'을 호출해야합니다. –

+0

* "객체가 값을 얻기 위해 프로토 타입 체인을 트래버스하지 않는 경우"* 아니요. –

답변

2

new operator을 통해 생성자 함수를 호출하여 Object.create()을 혼동하는 것 같습니다.

당신이 원하는 경우는 말했다 :

var myObj = new CT(); 

다음 당신의 myObjCT.prototype에 연결 될 수 있으므로 myObj.myValue4이 될 것입니다.

그러나 Object.create(CT)을 사용하면 프로토 타입이 CT 함수 자체 인 새 객체를 만들었습니다. 따라서 CT.prototype이 아니며 새 객체의 프로토 타입 체인의 일부가 아닙니다.입니다. CT.prototypeCT의 프로토 타입 체인이 아니며, new CT()으로 생성 된 객체의 프로토 타입이 될 객체를 지정합니다. Object.create()

더 올바른 사용은 프로토 타입에서 myValue 프로퍼티에의 액세스가 될 수 있도록 :

또는 기존 CT() 기능과 CT.prototype

var CT = { 
 
    myValue : 4 
 
}; 
 
var myObj = Object.create(CT); 
 
console.log(myObj.myValue);   //logs 4
당신은 말할 수 :

myObj = Object.create(CT.prototype); 
0

프로토 타입이 tance 변수는, 당신은 당신이

Array.forEach 
// undefined 

Array.prototype.forEach 
// ƒ forEach() { [native code] } 

new Array().forEach 
// ƒ forEach() { [native code] } 

[].forEach 
// ƒ forEach() { [native code] } 

function CT() {} 
CT.prototype.myValue = 4; 
var ct1 = new CT(); 
var ct2 = new CT(); 

ct1.myValue = 100; 

console.log(ct1.myValue); //logs 100 
console.log(ct2.myValue); //logs 4