Why Object.create is more than just Object creation?
In JavaScript, the Object.create()
method is different from the other object creation methods because it allows prototype-based inheritance explicitly and provides fine control over the created object's prototype and properties. Here's how it stands out:
1. Prototype Chain Control
Unlike other object creation methods (e.g., constructor functions, class instantiation, object literals, etc.),
Object.create()
lets you directly specify the prototype of the new object.This means you can create an object with a specified prototype, enabling inheritance from an existing object without defining a constructor.
Example:
const parent = {
greet() {
return "Hello!";
}
};
const child = Object.create(parent);
console.log(child.greet()); // Output: "Hello!"
console.log(Object.getPrototypeOf(child) === parent); // Output: true
In contrast, other methods like object literals ({}
) or constructors do not allow direct prototype specification.
2. Property Descriptors
Object.create()
allows the optional definition of property descriptors (e.g.,writable
,enumerable
,configurable
).This is useful when you need precise control over the properties' behavior.
Example:
const obj = Object.create({}, {
name: {
value: "Arsalan",
writable: false, // Cannot be changed
enumerable: true // Will show in loops
}
});
console.log(obj.name); // Output: "Arsalan"
obj.name = "Adeeb"; // No effect, writable: false
console.log(obj.name); // Still "Arsalan"
3. No Constructor Execution
Unlike
new Object()
, constructor functions, or class instantiation,Object.create()
does not invoke a constructor function.Instead, it creates an object with the given prototype directly.
Example:
function Person(name) {
this.name = name;
}
const p1 = new Person("Arsalan"); // Constructor is called
console.log(p1.name); // Output: "Arsalan"
const p2 = Object.create(Person.prototype);
console.log(p2.name); // Output: undefined (constructor not called)
4. Better for Prototypal Inheritance (without Classes)
- It provides a way to achieve prototypal inheritance without using
class
syntax, making it useful in functional or prototype-based programming styles.
Example of inheritance:
const animal = {
makeSound() {
return "Some sound";
}
};
const dog = Object.create(animal);
dog.bark = function() {
return "Woof!";
};
console.log(dog.makeSound()); // "Some sound" (inherited)
console.log(dog.bark()); // "Woof!"
5. Use in Object Composition
Object.create(null)
can be used to create objects without inheriting fromObject.prototype
, resulting in a "pure dictionary" object with no prototype chain pollution.
Example:
const obj = Object.create(null);
obj.name = "Arsalan";
console.log(obj.toString); // undefined, because there's no prototype
Summary: How Object.create()
is Different
Feature | Object.create() | Other Methods (Literals, new , Classes) |
Prototype Control | Directly specifies prototype | Implicitly inherits from Object.prototype |
Constructor Invocation | No | Yes (in case of new , class instantiation) |
Property Descriptors | Yes | No (without explicit defineProperty ) |
Prototypal Inheritance | Direct | Indirect via constructors or classes |
Performance | Slightly faster | May involve constructor overhead |
Thanks for reading .
Connect with me
https://www.linkedin.com/in/arsalan-adeeb/
Inqlaab Zindabaad ๐ฎ๐ณ