Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何动态扩展ES5和ES6类_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 如何动态扩展ES5和ES6类

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

我正在尝试建立一个工具库,用于所有环境。我有一个transpiler,所以生成的代码是ES5

问题是我的工具钩住了一个类方法,并将它们注入到原型中:

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