我正在嘗試構建一個工具庫以用於每個環境。我有一個轉譯器,所以我生成的代碼是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
應該是正確的),但是用函數包裝它的方法?
你會想看看裝飾者的建議。 – Bergi
這個想法是使用這個作爲裝飾器,但它應該可用於不會傳輸的項目。實際上,即使用作裝飾器,該代碼也應該執行。 –