ES6到ES5:Babel实现类扩展

Anw*_*ain 4 javascript ecmascript-5 ecmascript-6 babeljs

由于旧的浏览器支持,我们所有人都使用babeljs将ES6转换为ES5。当巴贝尔编译从另一类扩展的类。一部分已编译的代码与此类似:

...
if (superClass)
    Object.setPrototypeOf
      ? Object.setPrototypeOf(subClass, superClass)
      : (subClass.__proto__ = superClass);
...
Run Code Online (Sandbox Code Playgroud)

顶部代码块用于从父类延伸的静态属性。他们曾经Object.setPrototypeOf改变[[Prototype]]孩子的等级。它不是混淆.prototype[[Prototype]]是一个完全独立的东西。

MDN关于其使用的参考文献Object.setPrototypeOf如下:

根据现代JavaScript引擎如何优化属性访问的性质,更改对象的[[Prototype]]在每个浏览器和JavaScript引擎中的操作都非常缓慢。

我的问题出现在这里:如果我们可以通过Babel为什么使用另一种方式来达到相同的结果Object.setPrototypeOf?我试图通过遍历构造函数Function对象来从父类(我之前已为其分配)中复制所有静态方法。

...
if (superClass)
    Object.setPrototypeOf
      ? Object.setPrototypeOf(subClass, superClass)
      : (subClass.__proto__ = superClass);
...
Run Code Online (Sandbox Code Playgroud)

而且它比babel的执行速度还快!我创建了类似于babel扩展类的内容,并在jsPerf中对其进行了测试。我的前5个测试运行结果令人非常失望Object.setPrototypeOf:慢19%,慢20%和慢21%三倍。

我知道肯定还有一些原因,Object.setPrototypeOf可能需要使用。我想知道。如果是关于不可枚举的属性,那么我们绝对可以使用其他方法。

Ber*_*rgi 5

如果我们可以通过Babel为什么使用另一种方式来达到相同的结果Object.setPrototypeOf

仅仅是因为没有其他方法可以达到相同的结果。仅复制所有属性的当前值与从另一个对象动态继承不同。通天塔的目标是要正确,而不是很快。

而且它比babel的执行速度还快!我创建了类似于babel扩展类的内容,并在jsPerf中对其进行了测试。

好了,创建和扩展类慢,并且没关系。使用这些类(例如访问静态属性)是这里的重要方面。通常,没有问题是您对一个新的(尚未使用的)对象的[[prototype]]进行了突变-警告更加关注在对象生命周期的中间进行该突变。