Object.setPrototypeOf()
The Object.setPrototypeOf()
method sets the prototype (i.e., the internal [[Prototype]]
property) of a specified object to another object or null
.
Warning: Changing the
[[Prototype]]
of an object is, by the nature of how modern JavaScript engines optimize property accesses, currently a very slow operation in every browser and JavaScript engine. In addition, the effects of altering inheritance are subtle and far-flung, and are not limited to the time spent in theObject.setPrototypeOf(...)
statement, but may extend to any code that has access to any object whose[[Prototype]]
has been altered. You can read more in JavaScript engine fundamentals: optimizing prototypes.Because this feature is a part of the language, it is still the burden on engine developers to implement that feature performantly (ideally). Until engine developers address this issue, if you are concerned about performance, you should avoid setting the
[[Prototype]]
of an object. Instead, create a new object with the desired[[Prototype]]
usingObject.create()
.
Syntax
Object.setPrototypeOf(obj, prototype)
Parameters
obj
- : The object which is to have its prototype set.
prototype
- : The object's new prototype (an object or
null
).
- : The object's new prototype (an object or
Return value
The specified object.
Exceptions
TypeError
- : Thrown if one of the following conditions is met:
- The
obj
parameter is non-extensible, or it's an immutable prototype exotic object, such asObject.prototype
. - The
prototype
parameter is not an object ornull
.
- The
- : Thrown if one of the following conditions is met:
Description
Object.setPrototypeOf()
is generally considered the proper way to set the prototype of an object.
If the obj
parameter is not an object (e.g. number, string, etc.), this method does nothing.
For security concerns, there are certain built-in objects that are designed to have an immutable prototype. This prevents prototype pollution attacks, especially proxy-related ones. The core language only specifies Object.prototype
as an immutable prototype exotic object, whose prototype is always null
.
Object.isExtensible(Object.prototype); // true; you can add more properties
Object.setPrototypeOf(Object.prototype, {}); // TypeError: Immutable prototype object '#<Object>' cannot have their prototype set