2011-02-09 5 views
16

JavaScript 프로토 타입 상속에서 prototype.constructor 속성을 추가하는 목표는 무엇입니까? 예를 들어 설명하겠습니다. Sub.prototype.constructor = 서브를 추가하거나하지 않을 경우 "프로토 타입"의 "constructor"속성 설정의 이점

 
var Super = function() { 
    this.superProperty = 'Super Property' 
} 
var Sub = function() { 
    this.subProperty = 'Sub Property' 
} 

Sub.prototype = new Super(); 
Sub.prototype.constructor = Sub; // advantages of the statement 

var inst = new Sub(); 

다음 줄

모든 경우에 항상 true를 돌려줍니다.

 
console.log(inst instanceof Sub) // true 
console.log(inst instanceof Super) // true 

새로운 인스턴스를 가져올 때 유용 할 수도 있지만 언제 어떻게 될 수 있습니까?

미리 감사드립니다.

+2

대단한 질문입니다. – tybro0103

답변

10

개체를 구성하는 데 사용 된 함수를 정확히 반영하기 위해 constructor 속성을 올바르게 다시 설정하는 것입니다.

Sub.prototype = new Super(); 

console.log(new Sub().constructor == Sub); 
// -> 'false' 

Sub.prototype.constructor = Sub; 
console.log(new Sub().constructor == Sub); 
// -> 'true' 
+2

설정하지 않을 경우의 결과는 무엇입니까? 즉, Sub.prototype.constructor의 가치는 언제 실제로 중요합니까? Sub의 생성에 전혀 영향을 미치지 않는 것처럼 보입니다. 이것은 아무도 실제로 그것을 명백하게 밝히지 않는 "너무 명백한"것들 중 하나 여야합니다. :-) – Yetanotherjosh

+6

@Yetanotherjosh : 글쎄요, OP의 코드의 경우에, 그 라인을 나가면, 'inst.constructor === Super','new Sub()'로 인스턴스화 된 경우에도 마찬가지입니다. 이것은 일반적으로 그 속성에 대해 신경 쓰지 않는다면 문제가되지 않지만 다른 코드와 인스턴스를 공유하는 경우'new inst.constructor()'가 실제로 결과를 얻을 수있는 곳을 포함하여 어떤 경우에는 혼란을 야기 할 수 있습니다 'Sub()'가 아닌'Super()'의 인스턴스에서 (Sub.prototype'에 고유 한 속성이 없기 때문에). ** tl; 박사는 훌륭한 프로그래밍 실습 **입니다. –

관련 문제