Javascript 如何动态扩展ES5和ES6类
我正在尝试建立一个工具库,用于所有环境。我有一个transpiler,所以生成的代码是ES5 问题是我的工具钩住了一个类方法,并将它们注入到原型中:Javascript 如何动态扩展ES5和ES6类,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在尝试建立一个工具库,用于所有环境。我有一个transpiler,所以生成的代码是ES5 问题是我的工具钩住了一个类方法,并将它们注入到原型中: klass.prototype = Object.create( Object.getPrototypeOf(klass.prototype), modifiedDescriptors ); function ProxyCtor() { return klass.apply(this, arguments) } ProxyCtor.pro
klass.prototype = Object.create(
Object.getPrototypeOf(klass.prototype),
modifiedDescriptors
);
function ProxyCtor() { return klass.apply(this, arguments) }
ProxyCtor.prototype = Object.create(klass.prototype, modifiedDescriptors);
但是如果ES6类被传递,我们就不能修改它的原型
,因为它的描述符是{configurable:false,writable:false}
。因此,我决定使用ES5代码完全扩展该类,而不是修改原始原型:
klass.prototype = Object.create(
Object.getPrototypeOf(klass.prototype),
modifiedDescriptors
);
function ProxyCtor() { return klass.apply(this, arguments) }
ProxyCtor.prototype = Object.create(klass.prototype, modifiedDescriptors);
同样,这是不可能的,因为没有new
就无法调用ES6类构造函数:没有“new”就无法调用类构造函数X
好的,没问题,我将放弃ES5支持,我的代码将使用ES6类扩展该类,然后我将最终能够钩住这些方法:
class ProxyCtor extends klass {}
Object.defineProperty(ProxyCtor, 'prototype', Object.create(
Object.getPrototypeOf(ProxyCtor.prototype),
modifiedDescriptors
);
这再次失败,因为ProxyCtor.prototype
作为klass.prototype
是只读的
我可以使用Proxy
,但需要支持较旧的浏览器,出于优化原因,我需要在脚本启动时执行计算,而不是在调用方法时执行
所以问题是。。。如何扩展一个类ES6(意味着它应该具有相同的行为,并且klass的新ProxyCtor()instanceof应该为true),但用一个函数包装它的方法?您对
对象的使用。创建以覆盖。使用一个新对象创建原型
Object.defineProperties(klass.prototype, modifiedDescriptors)
这会使对象保持不变,但会更改其属性。您对对象的使用。创建覆盖。使用新对象覆盖
也很容易
Object.defineProperties(klass.prototype, modifiedDescriptors)
这会使对象保持不变,但会更改其属性。您需要查看decorators建议。其想法是将其用作decorator,但它应该可以在不可传输的项目中使用。事实上,这段代码甚至在用作装饰器时也应该执行。你会想看看装饰器的建议。想法是将其用作装饰器,但它应该可以在不可传输的项目中使用。事实上,这段代码应该在用作装饰器时执行。事实上,我试图保持不变性,但我们已经对类进行了修改,以便。。。非常感谢您的回答@Bergi的确,我曾试图保持不变性,但我们已经对类进行了变异,所以。。。非常感谢您的回答@bergi