2012-02-06 2 views
1

JavaScript에서 프로토 타입 상속을 사용하여 놀았으며 new 키워드의 동작에 혼란스러워했습니다. 상속 된 객체의 [[prototype]] 속성이 Function.prototype을 가리키는 이유와 상속 된 객체의 프로토 타입이 아닌 이유를 이해할 수 없습니다. 2 개 생성자 (아래) 기능을 고려 : 생성자 함수 Cat의 프로토 타입을 쿼리자바 스크립트 프로토 타입 상속 및 'new'키워드

function Animal(name) { 
    this.name = name; 
} 

function Cat(name) { 
    Animal.call(this, name); 
} 

Cat.prototype = new Animal(); 

을, 나는 몇 가지 흥미로운 결과를 얻을 :

나의 이해는 Cat[[prototype]]는 점에 업데이트해야합니다 것을
Cat.__proto__ === Animal.prototype; //returns false -- shouldn't this be true? 
Cat.__proto__ === Function.prototype; //returns true 
Cat.prototype instanceof Animal; //returns true, as expected 

Animal.prototype으로 설정하면 프로토 타입 속성이 Animal의 새 인스턴스로 설정됩니다. 본질적으로는

  1. Animal.prototype
  2. 내부적으로 설정된 새 개체를 Cat.[[prototype]] ~ Animal의 외부 프로토 타입 속성을 기반으로 만드시겠습니까?

Chrome과 FF에서 동일한 결과를 얻으려고했습니다. 뭐라 구요?

또한, 때 new Animal()Cat.prototype를 할당 , Cat.prototype 무엇을해야 하는가? 즉 :

//if Cat.prototype = new Animal(); 
//then 
Cat.prototype === Animal.prototype; //get false. Should this be true? 
+1

'Cat.prototype = Object.create (Animal.prototype);'- 상속을 설정합니다. –

+0

예, 저는'객체를 알고있었습니다.create()'를 만들지 만 prototypal 상속에 대한 '베어 본 (barebones)'접근 방식을 배우는 것이 목적이었습니다. 'Object.create()'는 다음 단계입니다. –

+2

'prototype' 객체가'Y'의 새로운 인스턴스에 할당 된 프로퍼티로 오염되어'X.prototype = new Y();'에 결함이 있습니다. 이 접근법을 피하고 어떻게해야 하는지를 (Object.create()를 통해)하고 싶을 것이다. –

답변

2
Cat.__proto__ === Animal.prototype; //returns false -- shouldn't this be true? 
Cat.__proto__ === Function.prototype; //returns true 

Cat 생성자 함수이다. 따라서 Function.prototype에서 상속 받고 Object.prototype에서 상속됩니다. Animal 생성자 및 다른 모든 함수 개체에도 마찬가지입니다.

Cat.prototype에 할당했기 때문에 Cat 생성자 자체의 상속 링크가 변경되지 않습니다 (상속 링크는 어쨌든 변경할 수 없습니다).

Cat 인스턴스는 Cat에서 상속되지 않지만 Cat.prototype에서 상속됩니다. 따라서 어쨌든 Cat 생성자의 프로토 타입 링크는 신경 쓰지 않아도됩니다.

+0

+1. 다른 방법 (어쩌면 분명하지 않을 수도 있음)을 넣으려면 인스턴스가 생성자의 내부 프로토 타입에서 상속됩니다. 선언 된 함수는'Function'의 인스턴스이므로 Function.prototype'을 상속합니다 (Cat도 그렇듯이). 'Cat '의 인스턴스 (즉,'new Cat()'에 의해 생성 된 객체)는'Cat.prototype'을 상속받습니다.이 예제는'Animal'의 인스턴스이기 때문에'Animal.prototype'도 상속받습니다. – RobG

+0

생성자 함수와 객체는 생성자 함수가 항상 Function.prototype에서 상속된다는 점에서 다르다. 객체 계층은 생성하는 동안 부모의 상속 계층에 따라 달라질 수 있습니다. 그러나 일단 선언/인스턴스화되면, 객체와 생성자 모두의 내부 ['[prototype] '계층 구조는 동일하게 유지됩니다. 이 올바른지? –

+0

@keyser_sozay 몇 가지 수정 사항 : (1) 생성자 함수 * 역시 * 객체입니다. 그래서 당신의 비교에서, 아마도 함수 객체와 비 함수 객체를 의미했을 것입니다. (2) 객체의 상속 링크는 항상 생성자의 프로토 타입 객체 (예 :'X.prototype'에서 상속받은'new X()'객체)를 가리 킵니다. *** 예, 개체가 생성되면 상속 링크를 변경 (리디렉션) 할 수 없습니다. –

0

[[prototype]] 속성이 Constructor 함수 대신 Object에 의해 소유됨을 나타냅니다. 은 그래서 예를 들어, 당신은

Cat.prototype.__proto__ === Animal.prototype; //Return true 

공용

Instance.__proto__ === Constructor.prototype; //Retrun true 

고양이 기능 유형의 인스턴스 생성자 함수 말할 것을 발견 할 것이다, 그래서 당신은이 결과를보고

Cat.__proto__ === Function.prototype; //Return true 

내 영어가 너무 지독하지만, 내가 뭔가 설명했으면 좋겠다. :-)

관련 문제