DEV Community

Cover image for Objects and Prototypes in JavaScript: Object Literals, Inheritance, and the Prototype Chain
Sharique Siddiqui
Sharique Siddiqui

Posted on

Objects and Prototypes in JavaScript: Object Literals, Inheritance, and the Prototype Chain

In JavaScript, objects are the building blocks of most applications. Whether you’re working with browser APIs, JSON responses, or custom data models, you’ll run into objects everywhere. Unlike some languages where inheritance is strictly class-based, JavaScript relies heavily on prototypes. In this article, we’ll explore how object literals, prototypal inheritance, and the prototype chain work together.

1. Object Literals

The simplest way to create an object is using an object literal:

javascript
const person = {
  name: "Alice",
  age: 25,
  greet: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};
person.greet(); // Hello, my name is Alice
Enter fullscreen mode Exit fullscreen mode

Key Features of Object Literals:

  • Direct and concise way to define objects with properties and methods.
  • Supports nesting other objects inside.

Shorthand syntax (since ES6) allows shorter function syntax:

javascript
const person = {
  name: "Bob",
  greet() {
    console.log("Hi, I'm " + this.name);
  }
};
Enter fullscreen mode Exit fullscreen mode

Object literals are perfect for creating small, standalone objects or configurations.

2. Prototypal Inheritance

Unlike class-based languages (like Java or C++), JavaScript uses prototype-based inheritance.

Every object in JavaScript internally has a link, often referred to as [[Prototype]], that points to another object. This link allows properties and methods to be shared among objects.

Example:
javascript
const animal = {
  eat() {
    console.log("Eating...");
  }
};

const dog = {
  bark() {
    console.log("Woof!");
  }
};

// Set prototype explicitly
Object.setPrototypeOf(dog, animal);

dog.bark(); // Woof!
dog.eat();  // Eating... (inherited from animal)
Enter fullscreen mode Exit fullscreen mode

Here, dog inherits from animal. Even though dog does not have an eat method, JavaScript looks at its prototype (animal) and finds it there.

3. The Prototype Chain

When you access a property on an object, JavaScript looks for it in this sequence:

  • The object itself.
  • Its prototype ([[Prototype]]).
  • The prototype of that prototype.
  • And so on… until null is reached.
  • This sequence is known as the prototype chain.
Example:
javascript
console.log(dog.toString());
Enter fullscreen mode Exit fullscreen mode
  • dog does not have a toString method.
  • JavaScript looks at animal (its prototype). Still not found.
  • It continues up the chain until it reaches Object.prototype.
  • Object.prototype defines toString, so it gets executed. If no property is found anywhere in the chain, JavaScript returns undefined.
Visualizing the Prototype Chain
text
dog → animal → Object.prototype → null
Enter fullscreen mode Exit fullscreen mode
  • dog has bark().
  • animal provides eat().
  • Object.prototype provides common methods like toString().
  • null means the end of the chain.

4. Prototypal Inheritance with Constructor Functions

Before ES6 introduced class, constructor functions were a common way to implement inheritance:

javascript
function Person(name) {
  this.name = name;
}

Person.prototype.greet = function() {
  console.log("Hello, I'm " + this.name);
};

const alice = new Person("Alice");
alice.greet(); // Hello, I'm Alice
Enter fullscreen mode Exit fullscreen mode

Here:

  • The function Person acts like a “class.”
  • Methods are added to Person.prototype, so all instances share them.
  • alice gets greet() via the prototype chain.

5. ES6 Classes (Syntactic Sugar)

In ES6, class was introduced as syntactic sugar around prototypes. This makes inheritance easier to read and write:

javascript
class Animal {
  eat() {
    console.log("Eating...");
  }
}

class Dog extends Animal {
  bark() {
    console.log("Woof!");
  }
}

const rex = new Dog();
rex.bark(); // Woof!
rex.eat();  // Eating...
Enter fullscreen mode Exit fullscreen mode

Behind the scenes, JavaScript still uses the prototype chain, but class provides a cleaner syntax for developers used to classical OOP.

Final Thoughts

JavaScript’s objects and prototype system may feel different if you’re used to strictly class-based languages. But once you understand:

  • Object literals for quick object creation,
  • Prototypal inheritance for sharing behavior,
  • Prototype chain for resolving properties,

you’ll see how flexible and powerful JavaScript really is.

Stay tuned for more insights as you continue your journey into the world of web development!

Check out theYouTubePlaylist for great JavaScript content for basic to advanced topics.

Please Do Subscribe Our YouTube Channel for clearing programming concept and much more ...CodenCloud

Top comments (0)