2009-07-09 6 views
0
function main() 
{ 
    this.one = 1; 
} 

main.prototype = { 
    display: function() 
    { 
    console.log(this.one); 
    return this; 
    } 
}; 

function addition() { 
    main.call(this); 
} 

addition.prototype = new main; 
addition.prototype.constructor = addition; 

addition.prototype = { 
    add: function(x) { 
    this.one += x; 
    return this; 
    } 
}; 

// addition.prototype.add = function(x) 
// { 
// this.one += x; 
// return this; 
// } 

display = new addition; 
display.add(3).add(5).display(); 

, 그것은 '9'를 로깅, 잘 작동합니다. 그렇지 않으면 위의 스 니펫을 실행하면 Firebug 1.4, Firefox 3.5에서 "display.add (3) .add (5) .display가 함수가 아닙니다"가 발생합니다.자바 스크립트 프로토 타입 상속 차이

두 세그먼트의 차이점은 무엇입니까? 난 항상 그들이 동일하다고 생각했거나 그 차이점에 대해 조언 해 주시고,/또는 어떻게 주석 처리 된 코드와 함께 작동시킬 수 있는지 생각해 보셨습니다.

또는 적어도 내가해야하는 키워드를 알려주고, 몇 시간 동안 맹목적으로 보았습니다.

감사합니다. 당신이 당신의 코드로 부모의 (주)의 프로토 타입을 덮어 쓰는 것처럼 보이는

답변

4

: 당신은 단지에 할당하기 때문에

addition.prototype = { 
    add: function(x) { 
    this.one += x; 
    return this; 
    } 
}; 

addition.prototype는 이제 새로운 객체입니다.

당신이 할 경우 : 당신이 display() 기능을 상속의 주요 유지, 그래서 당신은 addition.prototype에 속성을 추가하는

addition.prototype.add = function(x) { 
this.one += x; 
return this; 
} 

.

Btw, 어디에서이 코드를 가져 오나요? JavaScript에서 상속의 더 복잡한 예 중 하나입니다.

+0

아, 고마워! 이제는 의미가 있습니다. 이 문제에 관해 언급 한 첫 번째 사이트는 기억이 나지 않지만 다른 사이트 중 하나는 http://www.cristiandarie.ro/asp-ajax/JavaScriptPrototypeInheritance.html 입니다. 와우, 내가 찾은 모든 사이트 중에서, 가장 좋은 방법이 무엇인지 잘 모르는 가운데이 프로토 타입 상속의 모범 사례를 추천 할만한 사이트가 있습니까? –

+0

나는 Chu가 정확하다고 믿는다 : addition.prototype = ... 당신이 앞에서 만든 main.prototype을 확실히 자르고있어 더 이상 디스플레이를 사용할 수 없다. 나는 또한 그 예가 이상하다는 것에 동의한다. 먼저, draco는 함수 생성자가 대문자를 사용하여 다른 사람들에게 호출 할 때 'new'를 사용해야 함을 나타냅니다. 내가 우연히 다음과 같이 말하면 : m = main() 나는 방금 전역 네임 스페이스를 clobbered했습니다! 고전적인 패턴을 가진 다른 실제 이슈들이 많이 있습니다 (그대로 맹 글링되었습니다). 제 예제를 여기에서보십시오 : http://github.com/roblevintennis/Testing-and-Debugging-JavaScript – Rob

관련 문제