0

如果我定義了兩個類如下...有沒有一種方法,以保持相對於子超?

class A { 
    getParentInstance(...args) { 
    return new super.constructor(...args); 
    } 
} 

class B extends A {} 

console.log((new B).getParentInstance().constructor.name); 

Object登錄到控制檯,而不是我所希望的A。這是由於在super引用A.prototype.getParentInstanceA超類具體是Object。這是相對於可替換地,這將是super是相對於在原型鏈中的電流電平 - 用於B這將是A

我的問題是:有沒有一種方法來定義方法,以便在繼承時在原型鏈的每個級別使用超級相對?有效地導致...

(new B).getParentInstance().constructor.name === 'A' 
+0

像這樣的工廠方法通常是靜態的... – Alnitak

回答

0

Object.getPrototypeOf()魔術似乎是招:

class A { 
    getParentInstance(...args) { 
    const thisProto = this.constructor.prototype; 
    const RelativeSuperConstructor = Object.getPrototypeOf(thisProto).constructor; 
    return new RelativeSuperConstructor(...args); 
    } 
} 

class B extends A {} 

console.log((new B).getParentInstance().constructor.name); 

導致正確的 「超級」被抓住,因此根據需要記錄'A'

0

你可以嘗試這樣的事情

class A { 
    static getParentConstructor() { 
    return Object; 
    } 
} 

class B extends A { 
    static getParentConstructor() { 
    return A; 
    } 
} 

var b = new B(); 
var a = new (b.constructor.getParentConstructor())(); 
+0

是啊,這是一個很好的解決方案 - 我希望,雖然不通過可能的話使用繼承有冗餘代碼。 –

+0

想出一個辦法做到這一點上面。 –

相關問題