小编Anw*_*ain的帖子

ES6到ES5:Babel实现类扩展

由于旧的浏览器支持,我们所有人都使用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可能需要使用。我想知道。如果是关于不可枚举的属性,那么我们绝对可以使用其他方法。

javascript ecmascript-5 ecmascript-6 babeljs

4
推荐指数
1
解决办法
363
查看次数

标签 统计

babeljs ×1

ecmascript-5 ×1

ecmascript-6 ×1

javascript ×1