JavaScript .prototype

Home /

Table of Contents

About ‘.prototype’

In JavaScript, the ‘.prototype‘ property is a key component of the language’s object-oriented programming (OOP) model. It allows developers to create new objects that inherit properties and methods from existing objects, as well as to define custom methods and properties for objects and functions.

At its core, the ‘.prototype‘ property is a reference to an object that serves as the “parent” of a given object or function. When an object or function is created in JavaScript, it automatically gets a ‘.prototype‘ property, which is set to an empty object by default.

For example, let’s say we create a new object called ‘myObj‘:

JavaScript
const myObj = {};

If we then log the value of ‘myObj.prototype‘, we’ll get undefined, since ‘myObj‘ doesn’t inherit from any other object by default:

JavaScript
console.log(myObj.prototype); // undefined

However, if we create a new function called myFunc, and log its .prototype property, we’ll see that it has a reference to an empty object:

JavaScript
function myFunc() {}
console.log(myFunc.prototype); // {}

This empty object is where we can define custom properties and methods that will be inherited by any objects created with the ‘new‘ keyword and ‘myFunc‘ as the constructor.

For example, let’s add a method to ‘myFunc.prototype‘:

JavaScript
myFunc.prototype.myMethod = function() {
  console.log("Hello, world!");
};

Now, if we create a new object using ‘myFunc‘ as the constructor, we can call ‘myMethod‘ on that object, even though we didn’t define it directly on the object itself:

JavaScript
const myObj2 = new myFunc();
myObj2.myMethod(); // "Hello, world!"

This is because ‘myObj2‘ inherits from ‘myFunc.prototype‘, which in turn has a reference to ‘myMethod‘.

In summary, the ‘.prototype‘ property is a way to define properties and methods that will be shared across all instances of a given object or function. By setting the ‘.prototype‘ property of a constructor function, we can create a “template” for objects that will be created with that constructor, allowing us to reuse code and create more organized, efficient programs.

Exploring how the .prototype property can be used

The ‘.prototype‘ property in JavaScript is a powerful feature that can be used to add methods and properties to an object’s prototype chain. This approach allows for more efficient and organized code by enabling developers to reuse code across multiple instances of an object and reducing the amount of duplicate code.

When a new object is created in JavaScript using a constructor function, its prototype is automatically set to the constructor’s .prototype property. This means that any properties or methods defined on the constructor’s prototype will be inherited by all instances of the object.

For example, let’s say we have a constructor function for a ‘Person‘ object:

JavaScript
function Person(name, age) {
  this.name = name;
  this.age = age;
}

We can use the ‘.prototype‘ property to add a method to the ‘Person‘ object that will be shared by all instances of ‘Person‘:

JavaScript
Person.prototype.greet = function() {
  console.log(`Hi, my name is ${this.name} and I'm ${this.age} years old.`);
}

Now, we can create multiple Person objects and call the greet method on each one:

JavaScript
const person1 = new Person("Alice", 25);
const person2 = new Person("Bob", 30);

person1.greet(); // Hi, my name is Alice and I'm 25 years old.
person2.greet(); // Hi, my name is Bob and I'm 30 years old.

This approach saves us from having to define the ‘greet‘ method on each ‘Person‘ object individually, and allows us to easily update the method for all instances of ‘Person‘ by changing it on the prototype.

We can also use the ‘.prototype‘ property to add properties to an object’s prototype chain. For example, let’s add a ‘species‘ property to the ‘Person‘ prototype:

JavaScript
Person.prototype.species = "Human";

Now, we can access the ‘species‘ property on any ‘Person‘ object, even though it wasn’t defined directly on the object:

JavaScript
console.log(person1.species); // "Human"
console.log(person2.species); // "Human"

In summary, the ‘.prototype‘ property in JavaScript is a powerful tool for adding methods and properties to an object’s prototype chain, allowing for more efficient and organized code. By defining properties and methods on the prototype of a constructor function, we can create a “template” for objects that will be created with that constructor, and easily share code across multiple instances of the object.

Using the .prototype property to create custom objects and constructors

In JavaScript, the .prototype property can be used to create custom objects and constructors, simplifying the process of creating objects with shared properties and methods. By using .prototype, developers can define a “template” for objects that will be created with a constructor, allowing for more efficient and organized code.

Let’s take a look at an example. Suppose we want to create a program that models different types of vehicles, such as cars and motorcycles. We can use .prototype to define a Vehicle constructor with shared properties and methods that will be inherited by all instances of the Vehicle object.

JavaScript
function Vehicle(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

Vehicle.prototype.start = function() {
  console.log(`Starting the ${this.make} ${this.model}`);
};

Vehicle.prototype.stop = function() {
  console.log(`Stopping the ${this.make} ${this.model}`);
};

Vehicle.prototype.honk = function() {
  console.log(`Honk! Honk!`);
};

In this example, we define a Vehicle constructor that takes three parameters: make, model, and year. We also define three methods on the Vehicle prototype: start, stop, and honk. These methods can be called on any instance of the Vehicle object, allowing us to reuse code across different types of vehicles.

Now, let’s create a Car constructor that inherits from the Vehicle constructor:

JavaScript
function Car(make, model, year, numDoors) {
  Vehicle.call(this, make, model, year);
  this.numDoors = numDoors;
}

Car.prototype = Object.create(Vehicle.prototype);
Car.prototype.constructor = Car;

Car.prototype.drive = function() {
  console.log(`Driving the ${this.make} ${this.model}`);
};

In this example, we use the call method to invoke the Vehicle constructor within the Car constructor, passing in the necessary parameters. We then use Object.create to create a new object that inherits from the Vehicle.prototype, and assign it to the Car.prototype. Finally, we define a new method on the Car.prototype called drive.

Now, we can create a new Car object and call its methods:

JavaScript
const myCar = new Car("Honda", "Civic", 2022, 4);
myCar.start(); // "Starting the Honda Civic"
myCar.drive(); // "Driving the Honda Civic"
myCar.honk(); // "Honk! Honk!"

By using .prototype, we have simplified the process of creating custom objects and constructors, and have created a structure that allows for easy reuse of code across different types of objects.

Understanding the relationship between the .prototype property and inheritance

In JavaScript, the ‘.prototype’ property is closely tied to the concept of inheritance. When an object is created, it has a prototype, which is another object that serves as a template for the new object’s properties and methods. This prototype can be accessed and modified using the ‘.prototype’ property.

Inheritance is the mechanism by which objects can share properties and methods with other objects, creating hierarchies of objects that share common functionality. In JavaScript, inheritance is achieved by creating a prototype chain, where an object’s prototype is itself an object that has its own prototype, and so on.

Let’s take a look at an example to better understand how the ‘.prototype’ property and inheritance work together in JavaScript.

JavaScript
function Animal(name) {
  this.name = name;
}

Animal.prototype.sayName = function() {
  console.log(`My name is ${this.name}`);
};

function Dog(name, breed) {
  Animal.call(this, name);
  this.breed = breed;
}

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.bark = function() {
  console.log('Woof!');
};

In this example, we define two constructors: Animal and Dog. Animal takes a name parameter, and Dog takes a name and breed parameter. We then define a sayName method on the Animal prototype, and a bark method on the Dog prototype.

To establish inheritance between Animal and Dog, we use Object.create to create a new object that inherits from Animal.prototype, and assign it to Dog.prototype. We also set the constructor property of Dog.prototype to Dog, since it was overwritten by the Object.create method.

Now, let’s create a new Dog object and call its methods:

JavaScript
const myDog = new Dog('Fido', 'Golden Retriever');
myDog.sayName(); // "My name is Fido"
myDog.bark(); // "Woof!"

In this example, myDog has a prototype that inherits from Animal.prototype, which in turn inherits from Object.prototype. This allows myDog to access the sayName method defined on 'Animal.prototype‘. ‘myDog' also has its own bark method defined on its own prototype, allowing it to bark when the bark method is called.

By using the ‘.prototype‘ property and inheritance, we can create hierarchies of objects that share properties and methods, allowing for more efficient and organized code.

Share The Tutorial With Your Friends
Twiter
Facebook
LinkedIn
Email
WhatsApp
Skype
Reddit

Check Our Ebook for This Online Course

Advanced topics are covered in this ebook with many practical examples.

Other Recommended Article