2017-07-14 85 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 –