2009-04-15 4 views
7

프로토 타입 개념을 발견했을 때 자바 스크립트를 배웠습니다. 나는 고양이 클래스에 새로운 메소드를 추가하는 데 성공하지만, 원래 이야기 메서드를 재정에 실패했습니다.JavaScript 프로토 타입 함수가 원래 함수를 오버라이드하지 않습니다.

function cat(name) { 
    this.name = name; 
    this.talk = function() { 
     alert(this.name + " : I'm a girl!") 
    } 
} 

cat.prototype.talk = function() { 
    alert(this.name + " : I'm a dude!") 
} 

cat1 = new cat("felix") 
cat1.talk() 

왜 새 텍스트를 경고하지 않습니까?

답변

16

'function cat'은 단지 함수입니다. 프로토 타입은 빈 Object ({})입니다. '새 고양이'를 호출하여 멤버의 이름과 대화를 새 객체에 추가 할 수 있습니다. 이 새 Object 아래에는 여전히 함수 프로토 타입이있을 것입니다. 여전히 {}입니다. 당신이 'cat.prototype.talk'에 쓸 때

var c= new cat('Tiddles'); 

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: {} 

지금, 그 기본 목적에 구성원을 추가 :

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: { 'talk': function() {...} } 

인스턴스 'C'에 직접 설정 한 '대화'기능을한다 c의 생성자 프로토 타입에 간접적으로 설정된 'talk'에 대한 우선 순위.

그래서 당신은 'this'-할당 방법과'프로토 타입 '방법은 여기 상속의 두 가지 스타일을 혼합했습니다. 프로토 타입

작성 방법은 모든 객체 인스턴스로 복사 같은 회원의 중복 사본을하지 않는 장점이있다; 인스턴스에 쓰는 것은 바인딩 된 메서드의 문제를 해결한다는 장점이 있습니다. 어느 쪽을 선택 하느냐는 당신에게 달려 있지만 두 가지를 섞어서는 안됩니다. 프로토 타입 경로를 이동하려면 '이름'만 'this'에 작성해야합니다. 각 인스턴스에 대해 유일한 속성이기 때문입니다.

7

처음에 첨부 된 기능이 개체에 첨부됩니다 (각 인스턴스에 대해 1 개의 기능). 다른 하나는 프로토 타입에 첨부됩니다 (모든 인스턴스가 공유하는 1 개의 함수).

개체 수준의 멤버는 프로토 타입 수준의 멤버를 재정의합니다.

관련 문제