JavaScript is different from many other programming languages when it comes to Object-Oriented Programming (OOP) because it is prototype-based. Instead of using classes as its foundation, JavaScript uses prototypes.
In this blog, I'll explain the topics I learned today.
1. What is a Prototype?
A prototype is a shared object that stores common methods and properties.
Instead of creating a separate copy of the same method for every object, JavaScript stores it once in the prototype, and all objects created from the same constructor or class share it.
Example
function Person(name) {
this.name = name;
}
Person.prototype.greet = function () {
console.log(Hello, I'm ${this.name});
};
const p1 = new Person("Harshith");
const p2 = new Person("Rahul");
p1.greet();
p2.greet();
Here, both p1 and p2 use the same greet() method from Person.prototype.
This saves memory because JavaScript doesn't create multiple copies of the same function.
2. Prototype vs __proto__
This topic confused me at first, but here's the difference.
prototype
- Exists on functions.
- Used when creating new objects with the
newkeyword. - Stores shared methods.
Example:
function Person(name) {
this.name = name;
}
Person.prototype.greet = function () {};
const p1 = new Person("Harshith");
p1 will have a property called "proto" there it stores the prototype of Person
p1.proto=Person.prototype;
__proto__
- Exists on objects.
- Points to the object's prototype.
- JavaScript follows this link while searching for properties.
Example:
const person = new Person("Harshith");
console.log(person.proto === Person.prototype);
A simple way to remember:
-
prototypebelongs to functions. -
__proto__belongs to objects.
3. Prototype Chain
When JavaScript cannot find a property inside an object, it searches its prototype.
If it is still not found, it continues searching through the next prototype until it reaches null.
Example:
const animal = {
eat() {
console.log("Eating");
}
};
const dog = Object.create(animal);
dog.eat();
JavaScript searches like this:
dog
↓
animal.prototype
↓
null
This searching process is called the Prototype Chain.
4. Object.create()
Object.create() creates a new object whose prototype is another object.
Example:
const animal = {
eat() {
console.log("Eating");
}
};
const dog = Object.create(animal);
dog.eat();
The dog object doesn't have its own eat() method.
It inherits it from animal.
5. Classes are Syntactic Sugar
Before ES6, constructor functions were used to create objects.
function Person(name) {
this.name = name;
}
Person.prototype.greet=function (){
console.log(this.name);
}
Now we can write:
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(this.name);
}
}
Both work almost the same internally.
A class is simply a cleaner and easier syntax built on top of JavaScript's prototype system.
conclusion
At first, JavaScript prototypes can feel confusing because there are terms like prototype, __proto__, constructor functions, and classes. But once I understood that objects inherit methods through prototypes, everything started making sense.
Top comments (0)