为什么每当有人更改对象上方而不是下方的任何原型时,用于从对象检索属性的内联缓存就会失效?

问题描述 投票:0回答:1

我正在阅读 Mathias 和 Benedikt 的文章 JavaScript 引擎基础知识:优化原型。文章说:

每当有人更改关联原型或其之上的任何原型时,此

ValidityCell
就会失效。

我不明白为什么当原型上面更改时缓存会失效。

例如,给定一个原型链:

kitty ---> Cat.prototype ---> Animal.prototype ---> Object.prototype

还有一个方法

eat
存储在
Animal.prototype.eat
中。

如果代码尝试检索方法

kitty.eat()
,为什么它的缓存会在
Object.prototype
发生变异时失效,而不是在
Cat.prototype
发生变异时失效?

kitty.eat(); // While executing, the engine makes an IC for Animal.prototype.eat

Object.prototype.x = 0; // Should not have any effect on the chain from kitty to Animal.prototype?

kitty.eat(); // But the cache is invalidated so we need to traverse the chain to find `eat` again?
javascript prototype v8 javascript-engine
1个回答
0
投票

ValidityCell
代表了整个继承形状、关联原型及其之上的任何原型的有效性,而不仅仅是针对单个特定属性。
.eat
仍然引用相同的方法并不重要:
kitty.x
现在需要解析为与你搞乱
Object.prototype
之前不同的值,并且它们共享相同的原型有效性(
kitty
的原型有效性)形状)。

© www.soinside.com 2019 - 2024. All rights reserved.