首页 > 解决方案 > 为什么使用 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

标签: javascriptoptimization

解决方案


因为更改对象的原型很清楚,所以浏览器正在缓存他如何访问其属性,并且浏览器必须进行查找才能访问新原型,但我认为创建新原型或添加属性不会有太大区别该对象,因为它将进行查找。您可以看到 kyle simposon 关于更改原型的回答。凯尔辛普森原型


推荐阅读