2012-06-30 2 views
5

는 내가 Animal 클래스에서 프로토 타입 상속을 통해 상속하는 새로운 클래스 Dog을 만들려고 오전 :자바 스크립트 코드에서 Animal 클래스의 프로토 타입을 상속받을 수없는 이유는 무엇입니까?

function Animal() { 
    this.name = "animal"; 
    this.writeName = function() { 
    document.write(this.name); 
    }  
} 

function Dog() { 
    this.name = "dog"; 
    this.prototype = new Animal(); 
} 

new Dog().writeName() 

JS Fiddle

는 그러나, 나는 자바 스크립트 오류가 발생합니다 : Uncaught TypeError: Object #<Dog> has no method 'say'합니다.

왜? Dog 객체가 Animal 객체를 프로토 타입으로 유지하지 않아야합니까?

+0

올바른 코드를 붙여 넣으시겠습니까? 'say '라는 단어는 한 번 나타나지 않습니다. –

+0

수업이 없기 때문에? ;) 그러나 문제는 '이'가 이미 그 당시의 잘못된 객체 *와 ([프로토 타입]이 너무 늦어서'새로운 '이 활용되기 위해서). –

+2

BTW에서는 document.write 대신 console.log를 사용하고 경고합니다. 장기적으로 인생을 훨씬 쉽게 만들어 줄 것입니다. – hugomg

답변

3

... 라이언의 대답은, 올바른 물론이지만, 그는 정말 그것에 대해 다른 무엇 말을하고 초보자에게 명확하지 않을 수 없으므로 @

당신이 만들고있어 실수는 this.prototype = new Animal(); 현재 Dog예 (this에 의해 참조)prototype이라는 속성에 Animal 인스턴스를 할당한다는 것입니다,하지만라는 이름의 속성에 대한 특별한 아무것도 없다 이 문맥에서3210.

prototype 속성은 기능에만 개체에 마법입니다. 당신은 새로운 객체의 내부/숨겨진 [[프로토 타입]] 포인터가 객체를 참조가 SomeFunc.prototype가 가리키는 new SomeFunc()를 사용 SomeFunc의 새로운 인스턴스를 만들 때. prototype 이름은 다른 어떤 문맥에서도 특별하지 않습니다.

+1

그분을 위해 그것을 분명히하기 위해 서둘러 주셔서 감사합니다. – Ryan

2

"프로토 타입"속성은 일반 속성 일뿐입니다. 위임을 처리하는 실제 [[Proto]] 속성은 숨겨져 있으며 객체 생성 후 직접 조작 할 수 없습니다 (Firefox의 경우 일부 확장자를 제외하고는 __proto__ 속성).

function Animal() { 
    this.name = "animal"; 
    this.writeName = function() { 
    document.write(this.name); 
    }  
} 

function Dog() { 
    var dog = Object.create(new Animal()) 
    dog.name = "dog"; 
    return dog; 
} 

(new Dog()).writeName() 

더 관용적 예를 들면 다음과 같습니다

올바른 [[프로토 타입]] 속성 개를 만들 수 Object.create을 사용하는 일에 정신 유사한 올바른 자바 스크립트 상속 예를

ryan의 답변과 같을지라도, new Animal 대신 Object.create을 사용하여 개 프로토 타입을 인스턴스화하는 것이 좋을지 만 저는 여러분이하는 것처럼 생성자에 수동으로 부착하는 대신 별도의 동물 프로토 타입에 동물 메서드를 넣을 것입니다.

+0

@pst : "prototype"속성이 어떻게 특별하게 동작 할 것으로 기대했는지 이야기하고있었습니다. – hugomg

+0

좋아요, +1 :-) 제 3 판에서는'Object.create (proto)'를 [네이티브] 사용할 수 있습니까? –

+0

@pst : 지금 기억할 수는 없지만 사용할 수 없을 때 polyfill을 작성하는 것은 매우 쉽습니다. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create#Polyfill – hugomg

7
function Animal() { 
    this.name = "animal"; 
    this.writeName = function() { 
    document.write(this.name); 
    }  
} 

function Dog() { 
    this.name = "dog"; 

} 
Dog.prototype = new Animal(); 
dog = new Dog(); 
dog.writeName(); 

지금 개는 동물의 모든 속성을 가지고 있습니다.

jsfiddle

관련 문제