2016-09-25 1 views
1

기존 프로토 타입 계층 구조가 있으며이를 수정하여 계층 구조가 그대로 유지되지만 추가 프로토 타입이 추가되도록 수정하려고합니다. instanceof은 모든 프로토 타입에 대해 true를 반환해야합니다.instanceof가 작동하도록 기존 프로토 타입 체인에 기본 클래스 추가

I : B-> A라고하고 B-> A-> Base로 만들고 싶다고 말하십시오. 이제 instanceof은 A, B, Base에 대해 true를 반환해야합니다.

B.prototype.prototype과 Object.setPrototypeOf()를 사용해 보았지만 어느 경우에도 운이 없었습니다. Object.setPrototypeOf()와

샘플 :

class A {                                                        
    do() { console.log("do A"); }                                                        
}                                                          


class B extends A { 
    do() { console.log("do B"); } 

    doB() { console.log("what"); } 
} 


var a = new A(); 
var b = new B(); 

a.do(); 
b.do(); 
b.doB(); 

console.log(a instanceof A) // true 
console.log(a instanceof B) // false 

console.log(b instanceof A) // true 
console.log(b instanceof B) // true 


class Base { 
    doBase() { console.log("this is the base!"); } 
} 


// now add Base to B's chain, so that B -> A -> Base 
// TODO: doesn't work! 

Object.setPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(B)), Base.prototype) 
//Object.setPrototypeOf(Object.getPrototypeOf(B), Base) 


console.log(Object.getPrototypeOf(B)) 
console.log(Object.getPrototypeOf(Object.getPrototypeOf(B))) 


var c = new B(); 

console.log(c instanceof B) // true 
console.log(c instanceof A) // true 
console.log(c instanceof Base) // false (!!! how to fix it?) 

c.doBase();     // crash, not a function 
+1

어색해 보인다. 왜 그걸하고 싶니? 왜'Base'의 인스턴스를 만들어서'B'의 서브 클래스로 만들지 않겠습니까? 그것은 OO의 요점이 될 것입니다. – idmean

+0

"* 계층 구조가 그대로 유지되도록 수정하고 싶습니다."- 불가능합니다. 'A'는 원래'Object'를 상속 받았고 이제'Base'를 상속해야합니까? 그건 "그대로"는 아닙니다. – Bergi

+0

예, 정말 미친 것입니다. 그리고 내 선택이 아니야. 나는 ES6 클래스에서 사용할 수 있도록 이전 프레임 워크를 수정하려고합니다. 이 프레임 워크는 모든 사용자 구성 요소를 Component 기본 클래스로 확장하지만 프로토 타입을 덮어 쓰고 모든 원래 속성을 다시 복사하여이 작업을 수행합니다. 이제는 Component에서 상속 된 것처럼 보이므로 원래 클래스가 손실됩니다. 이제는 더 이상 인스턴스화 할 수 없습니다. 왜냐하면 바벨이 이제는 실패한'_classCallCheck'를 생성하기 때문입니다. – MiB

답변

1

이 B로부터의 상속 관계를 나타낸다;

console.log(Object.getPrototypeOf(B.prototype) === A.prototype); 

class A { do() { console.log("do A"); } } 

class B extends A { 
    do() { console.log("do B"); } 
    doB() { console.log("what"); } 
} 

class Base { 
    doBase() { console.log("this is the base!"); } 
} 

A를 참조하지 않고 필요합니다.

Object.setPrototypeOf(Object.getPrototypeOf(B.prototype), Base.prototype); 

;

console.log(new A() instanceof Base); // true 
console.log(new B() instanceof Base); // true 
(new B()).doBase(); // this is the base! 

이것은 어떻습니까? 그것으로 재생 here.

A를 참조하지 않고 클래스 확장과 동일한 방식으로 Object.setPrototypeOf(A,Base)을 수행하기 위해 Bergi가 언급 한대로 Object.setPrototypeOf(Object.getPrototypeOf(B.prototype.constructor), Base). (이 문제를 조사해야 순환 상속 오류가 발생한다고보고했습니다 ...)

위에서 설명한대로 here 테스트를 확장하여 클래스 생성자 상속을 수행했습니다. Chrome 53 (V8 5.3.332.45)에서 작동합니다.

편집 : 이것은 상속 체인을 원숭이 패치하는 것에주의하십시오. 그것은 성능을위한 환상적인 아이디어가 아닙니다.

+0

'Object.setPrototypeOf (A, Base)'를 잊지 마세요 – Bergi

+0

왜 그렇게할까요? – TylerY86

+0

멋진 아이디어! 하지만 내 문제는 정확히 내가 그 시점에서 A에 대해 모른다는 것입니다. 내가 얻은 것은 B에 대한 참조입니다. 이제는 A에 대해 알아보고 프로토 타입을 설정해야합니다. – MiB