如何动态扩展ES5和ES6类

时间:2017-07-14 15:48:41

标签: javascript ecmascript-6

我正在尝试构建一个可在每个环境中使用的工具库。我有一个转换器,所以我生成的代码是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应该是真的)但是用函数包装它的方法?

1 个答案:

答案 0 :(得分:3)

您使用Object.create用新对象覆盖.prototype可能很容易

Object.defineProperties(klass.prototype, modifiedDescriptors)

使对象保持不变但更改其属性。