javascript – ES6到ES5:Babel的类扩展实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – ES6到ES5:Babel的类扩展实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1781字,纯文字阅读大概需要3分钟。
内容图文
![javascript – ES6到ES5:Babel的类扩展实现](/upload/InfoBanner/zyjiaocheng/797/6e8df25f58ca44f190bde45c9fbdaf6a.jpg)
由于旧的浏览器支持,我们都使用babeljs将ES6转换为ES5.当babel编译一个从另一个类扩展的类时.编译代码的一部分类似于:
...
if (superClass)
Object.setPrototypeOf
? Object.setPrototypeOf(subClass, superClass)
: (subClass.__proto__ = superClass);
...
顶部代码块用于扩展父类的静态属性.他们使用Object.setPrototypeOf来改变子类的[[Prototype]].不要混淆.prototype和[[Prototype]]是一个完全独立的东西.
MDN在其有关使用Object.setPrototypeOf的参考资料中所说的内容如下:
Changing the [[Prototype]] of an object is, by the nature of how modern JavaScript engines optimize property accesses, a very slow operation, in every browser and JavaScript engine.
我的问题出现在这里:如果我们能用另一种方式获得相同的结果,为什么Babel使用Object.setPrototypeOf?我试图通过循环构造函数对象从父类(我之前分配给它)复制所有静态方法.
...
var parentStaticProps = parentClass.prototype.constructor;
for (var prop in parentStaticProps) {
childClass.prototype.constructor[prop] = parentStaticProps[prop];
}
...
它也比babel的实施更快!我已经创建了类似于babel扩展类并在jsPerf中测试它的东西.
对于Object.setPrototypeOf,我的前5个测试运行结果非常令人失望:慢19%,慢20%,慢3倍21%.
我知道Object.setPrototypeOf可能需要使用的原因.我想知道.如果它是关于非可枚举的属性,那么我们肯定可以使用其他一些方法.
解决方法:
If we can achieve the same result with another way why Babel uses
Object.setPrototypeOf
?
仅仅因为没有其他方法可以达到相同的结果.只是复制所有属性的当前值与从另一个对象动态继承不同.巴别塔的目标是正确,而不是快速.
And it is also faster than babel’s implementation! I have created something similar what babel does to extend a class and tested it in jsPerf.
好吧,创建和扩展类很慢,并不重要.使用这些类 – 例如访问静态属性 – 是这里的重要方面.通常没有问题是你改变了一个新的(未使用的)对象的[[prototype]] – 警告更关心的是在对象生命周期的中间进行变异.
内容总结
以上是互联网集市为您收集整理的javascript – ES6到ES5:Babel的类扩展实现全部内容,希望文章能够帮你解决javascript – ES6到ES5:Babel的类扩展实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。