2013-06-27 1 views
1

js 객체를 이해한다고 생각하면 새로운 것을 던져 넣습니다. 이 코드에서 프로토 타입을 추가하면 생성자가 같지 않게되는 이유

(바이올린 : http://jsfiddle.net/x8Eng/1/) 나는 프로토 타입을 추가 할 때

var impl = function() { 
     var P = function() {}; 
     P.prototype = {}; 
     return P; 
    }, 
    P = impl(); 
    p = new P(); 

console.log(p.constructor === P); 

생성자에 평등에 대한 검사는 false를 반환합니다,하지만 당신은 다음 프로토 타입을 추가하는 행을 제거하는 경우는 true를 돌려줍니다. P.prototype.prop = 'prop'을 통해 프로토 타입을 확장해도 평등이 유지됩니다. p instanceof P은 항상 true를 반환합니다.

누군가 이런 일이 발생하는 이유에 대해 설명해 주실 수 있습니까?

답변

2

객체는 p.construtor을 쓸 때, 따라서,이 프로토 타입 체인을 통해 해결 된 것, 즉, p.__proto__는, p.__proto__.__proto__ 다음을 찾았다된다는 "생성자"속성이없는 당신이 빈 객체에 P.prototype를 설정 이후 등

는 첫 번째 호출 (일명 {}constructor이없는, 일명 p.__proto__, P.prototype) 실패, 그래서 엔진은 Object.prototype하고있다 constructor을 발견 {}.__proto__에 보인다. 물론 이것은 P와는 아무런 관련이 없습니다. 단지 기본 Object 생성자 일뿐입니다. instanceof이 생성자를 사용하지 않는

참고, x instanceof F 엄격히 P.prototype` 생성자, 그것은 단지 프로토 체인을 변경 "설정"하지 않는`말하기 등 x.__proto__ == F.prototype or x.__proto__.__proto__ == F.prototype

2
P.prototype = {}; 

이는 프로토 타입을 변경하지 않습니다, 또한 Object에 생성자를 설정합니다. Object은 분명히 P과 동일하지 않습니다. 당신이 평등 보유하고 있음을 원하는 경우

는 재 할당 후 constructor 속성을 설정 prototype :

var P = function() {}; 
P.prototype = {}; 
P.prototype.constructor = P; 
return P; 
+1

로 해석됩니다. – georg

0

"개체"클래스는 JS와 constructor에있는 모든 객체의 프로토 타입 객체 클래스의 속성입니다 . 따라서 어떤 객체의 prototype 속성을 다른 것으로 재 할당하면 Object 클래스에 속한 constructor 속성도 손실됩니다. 그러나 객체의 프로토 타입에 새 속성을 추가하면 생성자가 손실되지 않습니다. ({} 같은 new 또는 리터럴를 통해) 코드에서 생성

관련 문제