2016-07-05 131 views
1

這個問題已經回答python:Can I dynamically convert an instance of one class to another?我可以在JavaScript中動態地將一個類的實例轉換爲另一個類的實例嗎?

但我很好奇,如果這將是可能的JavaScript與ES6/ES2015。

class A { ... } 
class B extends A { ... } 
class C extends A { ... } 

let test = new B(); 

// ... After a while I want to have an instance of C instead of B in test. 

這可能嗎?或者這是一個壞主意?

+2

你能展示一個用例嗎? JavaScript沒有實際的類,它們只是允許更簡單的原型繼承的語法糖。你將不得不通過「轉換」到另一個實例來顯示你的意思。 – 4castle

回答

3

你將不得不爲此寫一個方法來替換原型(這可以被認爲是一個非常糟糕的想法)。但是,您可以通過控制this並直接調用方法,將B的實例視爲C

由於JavaScript是鴨式的,沒有強類型,所以傳統的轉換(通常是類型轉換)通常是沒有意義的。所有狀態和行爲都附加到實例及其原型(即使在運行時),而不是編譯器對類型的理解。

可以使用調用任何從C方法上test

C.prototype.methodName.call(test, arg1, arg2); 

call method on a function調用與指定this的功能,這樣你就可以調用一個完全無關的對象上的方法(和它的工作只要他們分享合同)。

你總是可以聲明拷貝構造函數把BC,使用:

class C extends A { 
    static fromB(other: B): C { 
    return new C(B.foo, B.bar); 
    } 
} 

(使用流量/打字稿類型標註爲清楚起見)

最後,我最不喜歡的,聲稱, test實際上是C的一個實例,其通過與原型分開:

Object.setPrototypeOf(test, C); 

setPrototypeOf將取代test的參考B與參考CC.prototype任何方法將可以訪問通過test,像上面明確C.prototype呼叫,但無需指定this和使用.call

你也可以選擇將任何共享方法移動到A這個簡單的選項,並且可能完全避免這個問題,但這些都是JS的等價物。

相關問題