javascript - 为什么使用 Object.setPrototypeOf() 会严重影响性能
问题描述
一点背景知识:为了我自己的乐趣和学习的目的,我一直在实现一个用于 2 路数据绑定的库,并且我一直在逐步消除性能问题。这就是我注意到 MDN 文档顶部的 Object.setPrototypeOf 的大警告的方式,其中指出
警告:根据现代 JavaScript 引擎如何优化属性访问的本质,在每个浏览器和 JavaScript 引擎中更改对象的 [[Prototype]] 是一项非常缓慢的操作。改变继承对性能的影响是微妙而广泛的,并且不仅限于在 Object.setPrototypeOf(...) 语句中花费的时间,还可以扩展到任何可以访问任何对象的代码 [[原型]]已被更改。如果您关心性能,则应避免设置对象的 [[Prototype]]。相反,使用 Object.create() 创建一个具有所需 [[Prototype]] 的新对象。
我很好奇为什么会这样。
PS:对于任何对我为什么广泛使用 Object.setPrototypeOf 感到好奇的人,这里是该项目部分的源代码https://github.com/muggy8/proxymity/blob/master/src/data-proto.js
解决方案
因为更改对象的原型很清楚,所以浏览器正在缓存他如何访问其属性,并且浏览器必须进行查找才能访问新原型,但我认为创建新原型或添加属性不会有太大区别该对象,因为它将进行查找。您可以看到 kyle simposon 关于更改原型的回答。凯尔辛普森原型
推荐阅读
- javascript - 如何在 hyperstack 中上传文件?
- scala - 不考虑方法参数的默认值
- angular - 如何使主题多次发出
- google-chrome - 如何清除在 linux 上使用 google chrome 时设置的 cookie
- javascript - 按下空格键时触发按钮单击(网页)
- c++ - golang atomic.Load 是否具有获取语义?
- redux - 如何从 Redux 向 AppolloBoost 客户端传递值?
- c# - Discord.net 机器人。MusicBot 功能
- c++ - 如何从以前使用多个 cout 打印的内容中删除子字符串?
- python - 如何使用 src 标签从网页下载视频?