2012-05-14 2 views
1

개체의 메서드를 재정의하려고하지만 여전히 Object.getPrototypeOf()을 사용하여 프로토 타입의 원래 메서드를 호출하려고합니다. 이 기능은 처음에는 훌륭하지만, 메서드가 두 번 이상 재정의되는 경우 문제가 발생합니다. 스택 오버 플로우에서다음 프로토 타입의 재정의 된 메서드 오류를 호출하는 호출 프로토 타입의 재정의 된 메서드

이 코드 결과 :

A = 
{ 
    blurg: function() 
    { 
     puts('hey there') 
    } 
} 

B = (function buildB(){ 
    var obj = Object.create(A) 

    obj.blurg = function() 
    { 
     Object.getPrototypeOf(this).blurg.apply(this, arguments) 

     puts('hai!!!!') 
    } 

    return obj 
})() 

b = (function buildb(){ 
    var obj = Object.create(B) 

    obj.blurg = function() 
    { 
     Object.getPrototypeOf(this).blurg.apply(this, arguments) 

     puts('bye bye') 
    } 

    return obj 
})() 


b.blurg() 

jsFiddle

문제는 내가 this로 현재 객체와 프로토 타입의 메소드를 호출 할 것입니다. 이 메서드는 같은 일을 할 때 문제가 발생합니다.

내가 잘못 생각하고 있습니까? 올바른 프로토 타입을 가져 오도록 도우미 함수를 만들 수있는 방법이 있습니까? 나는 약간의 손실이있다.

+0

관련 : http://stackoverflow.com

것은이 문제를 해결하려면, 슈퍼 클래스 메소드를 호출 할 때 this를 사용하지 않는 새로운 하위 클래스를 정의 할 때마다 기본 클래스 참조를 저장하려고/questions/6827989/code-re-use-javascript-prototypal-inheritance – donut

답변

3

문제는 JavaScript에서 본질적으로 this이 프로토 타입 체인의 아래쪽 아래쪽 객체 인스턴스를 항상 참조하므로 위와 같은 계층 구조에서 메소드를 재정의 할 때 this.prototype.someMethod()은 객체의 정확한 기본 클래스를 참조합니다. 예를 들어 계층 구조의 최대 레벨이 두 개일 때 문제가되지는 않지만 세 가지 수준의 계층 구조를 정의 할 때 재귀가 불가피합니다! 여기 방법은 다음과 같습니다

b.someMethod가 호출
A: grand super class 
B: super class - inherits from A (B.prototype = A) 
C: class - inherits from B (C.prototype = B) 

a: instance of A (defines someMethod) 
b: instance of B (defines someMethod, calls A.someMethod through Object.getPrototypeOf(this)) 
c: instance of C (defines someMethod, calls B.someMethod through Object.getPrototypeOf(this)) 

, 성공적으로 호출 할 수 있습니다 A의 것으로 someMethod (B에 의해 호출 Object.getPrototypeOf(this) 반환 A) c.someMethod가 호출 될 때

그러나, 처음 차례로 b.someMethod를 호출하는 b.someMethod를 호출 왜냐하면 Object.getPrototypeOf(this)은 항상 C에 의해 호출 될 때 B를 반환하기 때문입니다! 그리고 여기에 스택 오버 플로우가 발생합니다.

A = 
{ 
    blurg: function() { 
     console.log('hey there') 
    } 
}; 

B = (function buildB() { 
    var obj = Object.create(A); 
    var base = Object.getPrototypeOf(obj); 

    obj.blurg = function() { 
     base.blurg.apply(this, arguments); 
     console.log('hai!!!!') 
    } 

    return obj 
})(); 

C = (function buildb() { 
    var obj = Object.create(B); 
    var base = Object.getPrototypeOf(obj); 

    obj.blurg = function() { 
     base.blurg.apply(this, arguments); 
     console.log('bye bye'); 
    } 

    return obj 
})(); 

C.blurg(); 
+0

고마워! 너는 내가했던 것보다 훨씬 더 우아하게 설명했다. "기본 클래스"참조를 저장하는 것은 내가 상상했던 것보다 훨씬 간단합니다. 자,이 "프로토 타이핑"방법이 있습니까? 이 솔루션만큼이나 간단하기 때문에 내가 잘못한 방식으로 해킹 할 것이라는 해킹이나 암시처럼 보입니다. – donut

관련 문제