我正在尝试构建一个可在每个环境中使用的工具库。我有一个转换器,所以我生成的代码是ES5。
这是我的工具挂钩类方法并将它们注入原型:
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);
同样这是不可能的,因为在没有new
的情况下无法调用ES6类构造函数: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
只是klass.prototype
。
我可以使用Proxy
,但要求是支持旧浏览器,出于优化原因,我需要在脚本启动时执行计算,而不是在调用方法时执行。
所以问题是......我如何扩展ES6类(意味着它应该具有相同的行为并且new ProxyCtor() instanceof klass
应该是真的)但是用函数包装它的方法?
答案 0 :(得分:3)
您使用Object.create
用新对象覆盖.prototype
可能很容易
Object.defineProperties(klass.prototype, modifiedDescriptors)
使对象保持不变但更改其属性。