我正在尝试构建一个工具库以用于每个环境。我有一个转译器,所以我生成的代码是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
这个想法是使用这个作为装饰器,但它应该可用于不会传输的项目。实际上,即使用作装饰器,该代码也应该执行。 –