2013-08-28 5 views
0

내가 자바 스크립트에서 상속에 대한 자습서를 읽고 있어요, 다음과 같은 문장이있다 :프로토 타입 자바 스크립트 상속 - 중복 객체

토끼 클래스의 객체를 들면 우리가 필요한 동물 클래스에서 상속 :

  1. 동물에서 토끼 정의 동물에게
  2. 상속 토끼를

  3. 을 정의

    Rabbit.prototype을 = 새로운 동물()

그들은이 접근법은 중복 개체를 만들 필요가 있다고 말합니다. 나는 왜 그 여분의 객체를 만들어야하는지 이해하지 못한다. 다음을 시도했지만 중복 오브젝트를 만들지 않고도 작업했습니다.

function Animal() {}; 
function Rabbit() {}; 
Rabbit.prototype = Animal.prototype 
Animal.prototype.go = function() {alert("I'm inherited method"}; 
var r = new Rabbit(); 
r.go(); 

여기서 내가 무엇을 놓치고 있습니까?

답변

3

는 당신이 놓치고있는 것은 코드와 RabbitAnimal동일한 프로토 타입을 공유하는 것입니다. eatCarrot 메서드를 Rabbit에 추가하면 다른 모든 Animal에도 해당 메서드가 있습니다.

사용중인 튜토리얼은 실제로 다소 오래된 것입니다. 대신 하위 클래스 선호되는 방법은 토끼에 대한 새로운 prototype 개체를 만드는 데 Object.create을 사용하는 것입니다 그 Animal.prototype에 체인 :이 하지예를의에서 Rabbit을 서브 클래스에 의존한다는 것을

Rabbit.prototype = Object.create(Animal.prototype); 
Rabbit.prototype.constructor = Rabbit; 

Animal.

자세한 내용은 MDN을 참조하십시오.

+0

+1은'Object.create'를 가리 킵니다. –

3

최고의 예에 의해 입증 당신의 접근 방식의 중요한 결핍이있다 : leechworm 이후

function Animal() {}; 
Animal.prototype.feed = function(){ 
    console.log("feeding") 
}; 

function Rabbit() {this.teeth = 4}; 
Rabbit.prototype = Animal.prototype; // oops 
Rabbit.prototype.feed = function(){ 
    if(this.teeth > 1){ 
    console.log("chewing") 
    } else { 
    throw "I have no teeth!" 
    } 
} 

var leechworm = new Animal; 
leechworm.feed(); //throws 

는 상관없이 우리가 정의하는 동물의 어떤 종류의 먹이를하지 수해야하지만, Animal이다는 Animal.prototype === Rabbit.prototype 이후 Animal.prototype.feedRabbit.prototype.feed과 같습니다. 거미는 그의 치아 결핍에 대해 불평 할 것입니다.

+1

하, 우리는 비슷한 유추를 생각해 냈습니다. – Alnitak

관련 문제