2017-07-14 95 views
0

我正在嘗試構建一個工具庫以用於每個環境。我有一個轉譯器,所以我生成的代碼是ES5。如何動態擴展ES5和ES6類

的事情是在一個類中的方法我的工具掛鉤並注入回原型:

klass.prototype = Object.create(
    Object.getPrototypeOf(klass.prototype), 
    modifiedDescriptors 
); 

但是,如果一個ES6類是通過我們不能修改它的prototype因爲它的描述符{configurable: false, writable: false}。所以,我決定充分類ES5代碼擴展,而不是修改原來的原型:

function ProxyCtor() { return klass.apply(this, arguments) } 
ProxyCtor.prototype = Object.create(klass.prototype, modifiedDescriptors); 

再次,這是不可能的,因爲一個ES6類的構造函數不能沒有new調用:Class constructor X cannot be invoked without 'new'

否問題我送ES5的支持和我的代碼將使用ES6類擴展了類,然後我將最終能夠鉤的方法:

class ProxyCtor extends klass {} 

Object.defineProperty(ProxyCtor, 'prototype', Object.create(
    Object.getPrototypeOf(ProxyCtor.prototype), 
    modifiedDescriptors 
); 

這再次失敗,因爲ProxyCtor.prototype是readonl y爲klass.prototype

爲此,我可以使用Proxy,但需要支持舊瀏覽器,並且出於優化原因,我需要在腳本啓動時執行計算,而不是在調用方法時執行。

所以問題是......如何擴展一個ES6類(意味着它應該具有相同的行爲,並且new ProxyCtor() instanceof klass應該是正確的),但是用函數包裝它的方法?

+0

你會想看看裝飾者的建議。 – Bergi

+0

這個想法是使用這個作爲裝飾器,但它應該可用於不會傳輸的項目。實際上,即使用作裝飾器,該代碼也應該執行。 –

回答

3

你的Object.create使用用一個新對象覆蓋.prototype可能很容易被

Object.defineProperties(klass.prototype, modifiedDescriptors) 

,保持目標不變,但改變其性質。

+0

事實上,我試圖保持不變,但我們已經在改變班級,所以...非常感謝你的回答@bergi –