2013-08-26 3 views
3

저는 John Resig의 JavaScript 닌자의 비밀 ()에서 JavaScript의 프로토 타입 상속을 배우면서 다음 코드 예제에서 어떤 일이 일어 났는지 궁금합니다.JavaScript의 프로토 타입 상속 모델에 결함이 있습니까?

function Person() {} 

Person.prototype.sayHello = function() { 
    alert("Hello World"); 
} 

function Ninja() {} 

Ninja.prototype.swingSword = function() { 
    alert("I can swing my sword."); 
} 

Ninja.prototype = new Person(); 

var ninja1 = new Ninja(); 

지금까지 내가 아는 한, 코드 줄의 모든 결과는 Ninja 객체, 즉 프로토 타입을 통해 swingSword 방법이있는 변수 ninja1 참조 것입니다, 그리고 Person 년대의 원형 상속을 통해 프로토 타입은 sayHello 방법을 사용합니다. 내가 혼란 스러워요

는 다음에있다 : (방법을 될 일이) 재산 swingSword이의 프로토 타입 '사람 인스턴스는 Ninja에 할당 이전의 프로토 타입 'Ninja에 부착 된 이후, 것 아닙니다 나중에 Person 인스턴스를 할당하면 swingSword 속성/메서드를 덮어 쓸 수 있습니까? 그렇지 않은 경우 Ninja의 프로토 타입 객체 (프로토 타입 객체를 참조 함)는 Person 인스턴스, 을 모두 참조하는 경우 swingSword 속성을 가질 수 있습니까?

+1

당신이 코드를 실행 했습니까? 'ninja1'이'sayHello'와'swingSword' 둘 다 가지고 있다고 생각하게 만드는 이유는 무엇입니까? –

+0

Ninja의 프로토 타입은'Ninja.prototype = new Person();'을 할 때 완전히 덮어 씁니다. 그리고'ninja1'은 이것의 끝에 swingSword 메소드를 가지지 않을 것입니다. 이것은 프로토 타입 상속을하는 방법이 아닙니다. – RoryKoehein

+0

상속을 위해 부모 (새로운 Person)의 인스턴스를 강제로 생성하지 않으려면'Ninja.prototype = Object.create (Person.prototype); '또는 도우미 함수를 사용할 수 있습니다. 기타 생성자 함수에 대한 자세한 내용은 다음을 참조하십시오. http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 인스턴스 특정 멤버를 사용하고 있지는 않지만 'Person.call);'Ninja 생성자 본문에 있습니다 (링크 참조). – HMR

답변

관련 문제