2012-12-05 4 views
8
var p = function() { 
    this.show = function() { 
     alert('hello world!!!'); 
    } 
} 

p.prototype.show = function() { 
    alert('haha'); 
} 

var o = new p(); 
o.show(); 

경고가 "hello world!!!" 인 이유는 무엇입니까?프로토 타입에 선언 된 함수가 호출되지 않는 이유는 무엇입니까?

프로토 타입 방법을 수정할 수 있습니까?

+1

매우 철저한 설명 : http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript –

+1

FYI : 다음과 같은 경우 프로토 타입 방법을 호출 할 수 있습니다.'p. prototype.show.call (o)' – Prinzhorn

답변

7

왜냐하면 생성자에서 정의한 특정 함수가 프로토 타입을 통해 상속 된 함수를 대체하기 때문입니다. EcmaScript specification에서

: 생성자에 의해 생성

모든 객체는 생성자의 "프로토 타입"속성의 값 (객체의 프로토 타입이라고) 암시 적 참조를 있습니다. 또한, 프로토 타입에 null이 아닌 암시 적 참조가있을 수 있습니다. 이를 프로토 타입 체인이라고합니다. 객체의 속성에 대한 참조가 생성되면 의 첫 번째 객체에있는 해당 이름의 속성에 대한 참조는 해당 이름의 속성을 포함하는 프로토 타입 체인입니다. 다른 단어의 경우 먼저 직접 언급 한 객체가 해당 속성에 대해 검사됩니다. 해당 객체가 명명 된 속성을 포함하면 참조가 참조하는 속성입니다. 해당 객체에 이 없으면 해당 객체의 프로토 타입이 검사됩니다. ; 등등.

간단히 말해서 : 함수 (또는 이름으로 속성)를 찾을 때 객체에서 시작한 다음 프로토 타입 체인으로 올라갑니다.

+1

위대한 답 =) –

3

prototype.show 메서드를 p 함수보다 우선 적용합니다.

1

Javascript에서는 속성이 해결되면 엔진은 먼저 개체의 속성을 확인합니다. 귀하의 예제에서 객체는 this으로 표시됩니다. 속성을 찾으면이 경우 show (함수가 속성 일 수 있음을 기억하십시오)은 해당 속성을 사용합니다. 속성이 발견되지 않으면 속성을 해결하기 위해 프로토 타입 체인을 반복합니다.

관련 문제