Organizing Code in JavaScript – Classes, Modules, and Object-Oriented Inheritance

JavaScript offers two major patterns for organizing code: classes and modules. This article focuses on class-based design, including how to define and instantiate classes, encapsulate data and behavior, and use inheritance and polymorphism to extend functionality. Understanding these patterns helps developers write clean, maintainable, and scalable programs.

classmoduleinheritancepolymorphism

~3 min read • Updated Oct 20, 2025

Introduction


In JavaScript, two common patterns for organizing code are classes and modules. These patterns can be used independently or together. Understanding both is essential for writing well-structured JS programs.


Classes in JavaScript


A class defines a custom data structure that includes both data and behavior. Classes are not values themselves — they must be instantiated using new to create usable objects.


class Page {
  constructor(text) {
    this.text = text;
  }
  print() {
    console.log(this.text);
  }
}

class Notebook {
  constructor() {
    this.pages = [];
  }
  addPage(text) {
    var page = new Page(text);
    this.pages.push(page);
  }
  print() {
    for (let page of this.pages) {
      page.print();
    }
  }
}

var mathNotes = new Notebook();
mathNotes.addPage("Arithmetic: + - * / ...");
mathNotes.addPage("Trigonometry: sin cos tan ...");
mathNotes.print();

Here, the Page class stores a text string and defines a print() method. The Notebook class manages an array of pages and provides methods to add and print them.


Class Inheritance


JavaScript supports class inheritance, allowing child classes to extend parent classes and reuse their behavior:


class Publication {
  constructor(title, author, pubDate) {
    this.title = title;
    this.author = author;
    this.pubDate = pubDate;
  }
  print() {
    console.log(`
Title: ${this.title}
By: ${this.author}
${this.pubDate}
`);
  }
}

class Book extends Publication {
  constructor(details) {
    super(details.title, details.author, details.publishedOn);
    this.publisher = details.publisher;
    this.ISBN = details.ISBN;
  }
  print() {
    super.print();
    console.log(`
Publisher: ${this.publisher}
ISBN: ${this.ISBN}
`);
  }
}

class BlogPost extends Publication {
  constructor(title, author, pubDate, URL) {
    super(title, author, pubDate);
    this.URL = URL;
  }
  print() {
    super.print();
    console.log(this.URL);
  }
}

Both Book and BlogPost extend Publication and override the print() method. They use super.print() to call the parent method and then add their own output.


Polymorphism


Having methods with the same name in both parent and child classes — and choosing the correct one at runtime — is called polymorphism. It adds flexibility to object-oriented design.


Conclusion


Classes and inheritance in JavaScript provide powerful tools for organizing data and behavior. By using classes, developers can create structured, extensible, and readable code. Understanding when and how to use these patterns is key to professional JS development.


Written & researched by Dr. Shahin Siami