In the first chapter of this section, we mentioned that there are modern methods to setup a prototype.
The __proto__ is considered outdated and somewhat deprecated (in browser-only part of the JavaScript standard).
The modern methods are:
- Object.create(proto, [descriptors]) – creates an empty object with given
protoas[[Prototype]]and optional property descriptors. - Object.getPrototypeOf(obj) – returns the
[[Prototype]]ofobj. - Object.setPrototypeOf(obj, proto) – sets the
[[Prototype]]ofobjtoproto.
These should be used instead of __proto__.
For instance:
let animal = {
eats: true
};
// create a new object with animal as a prototype
let rabbit = Object.create(animal);
alert(rabbit.eats); // true
alert(Object.getPrototypeOf(rabbit) === animal); // true
Object.setPrototypeOf(rabbit, {}); // change the prototype of rabbit to {}
Object.create has an optional second argument: property descriptors. We can provide additional properties to the new object there, like this:
let animal = {
eats: true
};
let rabbit = Object.create(animal, {
jumps: {
value: true
}
});
alert(rabbit.jumps); // true
The descriptors are in the same format as described in the chapter Properti flag dan Deskriptor.
We can use Object.create to perform an object cloning more powerful than copying properties in for..in:
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
This call makes a truly exact copy of obj, including all properties: enumerable and non-enumerable, data properties and setters/getters – everything, and with the right [[Prototype]].