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