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