Background
The JavaScript language provides two methods for manipulating the prototype property of an object: the standard setPrototypeOf function and the non-standard __proto__ property. However, it is strongly discouraged to mutate the prototype of an object using either of these methods.
Performance Implications
According to the MDN documentation, mutating the prototype significantly slows down subsequent execution in modern JavaScript implementations. This is because the process involves changing the object's type, which invalidates previously optimized code and forces the interpreter to deoptimize. This deoptimization process can have a significant impact on performance.
Comparison of Mutating Methods
Both foo.__proto__.bar = bar and Foo.prototype.bar = bar create a bar property on the Object.getPrototypeOf(foo) object. However, setting the __proto__ property itself, as in fred.__proto__ = Object.prototype or Object.setPrototypeOf(fred, Object.prototype), is what triggers the performance degradation.
Underlying Reasons
Changing the prototype chain of an existing object disrupts the internal type optimizations employed by JavaScript engines. The engine must discard previously compiled code and fall back to non-optimized code, leading to a performance penalty.
Expert Opinions
Various experts have expressed concerns about mutable prototypes:
Alternatives
Instead of mutating the prototype of an existing object, it is recommended to create new objects with a different prototype chain using Object.create(). This approach preserves optimizations and avoids the performance penalty associated with prototype mutation.
The above is the detailed content of Why Does Mutating Object Prototypes Lead to Performance Degradation in JavaScript?. For more information, please follow other related articles on the PHP Chinese website!