≡ Menu

JavaScript modules allow you to break your code into separate files, making it organized, reusable, and maintainable. This guide will walk you through the basics of ES Modules (ECMAScript Modules), the standard module system in JavaScript.


1. What are JavaScript Modules and Why Use Them?

Before modules, all JavaScript ran in a global scope, leading to a problem called “namespace pollution” where different parts of your code could accidentally overwrite variables in another file.

A module is simply a file that exports reusable pieces of code (functions, variables, classes) for other files to import.

Key Benefits:

  • Isolation: Variables and functions inside a module are private by default. Only what you explicitly export is visible outside.

  • Reusability: Write a function once and import it anywhere in your project.

  • Maintainability: Easier to understand, debug, and update small, focused files.

  • Dependency Management: Modules make it clear exactly what code is needed by another file.


2. Setting up ES Modules in HTML

To tell the browser to treat your JavaScript file as a module, you need to add type="module" to your script tag in your HTML file

<!DOCTYPE html>
<html>
<head>
    <title>JS Modules Demo</title>
</head>
<body>
    <h1>Check the Console!</h1>
    <script type="module" src="app.js"></script>
</body>
</html>

3. Named Exports and Imports

This is the most common way to share multiple pieces of code from a single module file.

A. Creating the Module (utils.js)

In your module file, use the export keyword before any variable, function, or class you want to make available.

// utils.js

// Exporting a function
export function add(a, b) {
    return a + b;
}

// Exporting a constant
export const API_KEY = '12345-abcde';

// You can also export them all at the end
function subtract(a, b) {
    return a - b;
}
export { subtract };

B. Importing and Using the Module (app.js)

In the file that needs the code, use the import keyword with curly braces {} to specify the exact names you want to import.

// app.js

import { add, API_KEY } from './utils.js';
import { subtract } from './utils.js'; // Can be imported separately or with others

const result = add(10, 5);
console.log(`10 + 5 = ${result}`); // Output: 10 + 5 = 15
console.log(`API Key: ${API_KEY}`); // Output: API Key: 12345-abcde

// You must include the file extension (e.g., .js) for browser imports!

Renaming Named Imports:

If you have a name conflict, you can rename an import using the as keyword:

// app.js
import { add as sum, subtract } from './utils.js';

console.log(sum(8, 2)); // 10

4. Default Exports and Imports

A module can only have one default export. This is typically used to export the main entity of the file (like a class or a primary function).

A. Creating the Default Export (User.js)

Use the export default keywords.

// User.js

export default class User {
    constructor(name) {
        this.name = name;
    }

    greet() {
        console.log(`Hello, my name is ${this.name}`);
    }
}

B. Importing the Default Export (app.js)

When importing a default export, you do not use curly braces, and you can give the imported item any name you like.

// app.js
import MyUserClass from './User.js'; // We named the import 'MyUserClass'

const user = new MyUserClass('Alice');
user.greet(); // Output: Hello, my name is Alice

💡 Pro Tip: You can mix default and named exports in the same file!


5. Dynamic Imports (The Next Level)

Standard imports are static, meaning they are loaded before the rest of the code runs.

Dynamic imports use the import() function syntax and allow you to load a module on demand (asynchronously). This is great for performance, as you can load large modules only when the user needs them.

// app.js

const button = document.getElementById('load-chart-btn');

button.addEventListener('click', async () => {
    // Dynamically load the 'chart-library.js' module
    try {
        const chartModule = await import('./chart-library.js');
        
        // Use the exported function
        chartModule.renderChart('data-container');
        console.log('Chart module loaded and rendered!');
    } catch (error) {
        console.error('Failed to load chart module:', error);
    }
});

Conclusion

ES Modules are the foundation of modern JavaScript. By using export and import correctly, you can create structured, efficient, and highly maintainable applications. Start splitting your larger projects into small, focused module files today!

Useful links below:

Let me & my team build you a money making website/blog for your business https://bit.ly/tnrwebsite_service

Get Bluehost hosting for as little as $1.99/month (save 75%)…https://bit.ly/3C1fZd2

Best email marketing automation solution on the market! http://www.aweber.com/?373860

Build high converting sales funnels with a few simple clicks of your mouse! https://bit.ly/484YV29

Join my Patreon for one-on-one coaching and help with your coding…https://www.patreon.com/c/TyronneRatcliff

Buy me a coffee ☕️https://buymeacoffee.com/tyronneratcliff

{ 0 comments }

Object-Oriented Programming (OOP) is a programming paradigm that uses objects—data structures consisting of data fields and methods—to design applications and computer programs.

JavaScript is a multi-paradigm language that supports OOP principles, making it a powerful tool for building complex, scalable applications.

This tutorial will guide you through the core concepts of OOP in modern JavaScript, primarily using ES6 Classes.


1. 🧱 Objects and Classes

The fundamental concept of OOP is the Class, which acts as a blueprint for creating Objects.

A. Objects

An object is an instance of a class, representing a real-world entity. In JavaScript, you can create objects using literal notation, constructor functions, or classes.

// Object Literal Notation
const car = {
  make: "Honda",
  model: "Civic",
  year: 2020,
  start: function() {
    console.log("Engine started!");
  }
};

console.log(car.make); // Output: Honda
car.start();          // Output: Engine started!

B. Classes (The Blueprint)

ES6 introduced the class keyword, which provides a much cleaner and more familiar syntax for creating blueprints.

// 
class Vehicle{
  // 1. The constructor method is called when a new object is created.
  constructor(make, model, year) {
    this.make = make;
    this.model = model;
    this.year = year;
  }

  // 2. A method (function) that all Vehicle objects will have
  getDetails() {
    return `${this.year} ${this.make} ${this.model}`;
  }
}

// Creating a new object (instantiation)
const myCar = new Vehicle("Toyota", "Camry", 2022);

console.log(myCar.getDetails()); // Output: 2022 Toyota Camry

2. 🔑 The Four Pillars of OOP

OOP is built upon four main principles: Encapsulation, Abstraction, Inheritance, and Polymorphism.

A. Encapsulation (Bundling Data and Methods)

Encapsulation means bundling the data (properties) and the methods (functions) that operate on that data into a single unit (the object/class). It also involves restricting direct access to some of an object’s components, which is crucial for preventing accidental modification.

  • In JavaScript: Traditionally, JavaScript has not had true private properties. Developers use conventions, like prefixing a property with an underscore (_), to signal that it should be treated as private.

  • Modern JavaScript (ES2020+): You can now define truly private class fields using the # prefix.

class BankAccount{
  #balance = 0; // Truly private field

  constructor(initialDeposit) {
    if (initialDeposit > 0) {
      this.#balance = initialDeposit;
    }
  }

  deposit(amount) {
    if (amount > 0) {
      this.#balance += amount;
    }
  }

  // A method (public interface) to safely retrieve the private data
  getBalance() {
    return this.#balance;
  }
}

const account = new BankAccount(100);
account.deposit(50);
console.log(account.getBalance()); // Output: 150
// console.log(account.#balance); // SyntaxError: Private field '#balance' must be declared in an enclosing class

B. Inheritance (The “is-a” Relationship)

Inheritance allows a new class (the subclass or child class) to inherit properties and methods from an existing class (the superclass or parent class). This promotes code reusability.

  • extends: Used to establish the inheritance relationship.

  • super(): Used inside the subclass’s constructor to call the parent class’s constructor and initialize its properties.

// 
class Car extends Vehicle{ // Car is a subclass of Vehicle
  constructor(make, model, year, doorCount) {
    // Call the parent (Vehicle) constructor
    super(make, model, year); 
    this.doorCount = doorCount;
  }

  // A method specific to Car
  getDoorCount() {
    return `This car has ${this.doorCount} doors.`;
  }
}

const sedan = new Car("Ford", "Focus", 2018, 4);

console.log(sedan.getDetails());     // Inherited from Vehicle: 2018 Ford Focus
console.log(sedan.getDoorCount());   // Own method: This car has 4 doors.

C. Polymorphism (Many Forms)

Polymorphism allows objects to take on “many forms,” meaning a single interface (a method name) can be used to represent different implementations. The most common form in JavaScript OOP is Method Overriding.

  • Method Overriding: A subclass provides its own specific implementation of a method that is already defined in its superclass.

class ElectricCar extends Car{
  constructor(make, model, year, doorCount, range) {
    super(make, model, year, doorCount);
    this.range = range;
  }

  // Method Overriding: Overrides the getDetails() method from Vehicle/Car
  getDetails() {
    // We can call the parent's method using super
    const carDetails = super.getDetails(); 
    return `${carDetails} and has a ${this.range} mile range.`;
  }
}

const tesla = new ElectricCar("Tesla", "Model 3", 2024, 4, 333);

// The getDetails() method is called, but the specific implementation 
// from ElectricCar is executed.
console.log(tesla.getDetails()); 
// Output: 2024 Tesla Model 3 and has a 333 mile range.

D. Abstraction (Hiding Complexity)

Abstraction is the concept of showing only essential information and hiding complex implementation details.

In JavaScript:

  • Classes/Objects achieve abstraction by providing public methods (like getBalance() or getDetails()) that serve as a simple, high-level interface, while the internal logic (like how #balance is updated) remains hidden.

  • By using methods to interact with data (Encapsulation), you naturally implement Abstraction.


3. 📝 Summary of OOP Terms

Term Definition JavaScript Example
Class A blueprint for creating objects. class Vehicle { ... }
Object An instance of a class. const myCar = new Vehicle(...)
Property A piece of data (variable) associated with an object. this.make
Method A function associated with an object. getDetails()
Constructor A special method for creating and initializing an object created with a class. constructor(...)

Useful links below:

Let me & my team build you a money making website/blog for your business https://bit.ly/tnrwebsite_service

Get Bluehost hosting for as little as $1.99/month (save 75%)…https://bit.ly/3C1fZd2

Best email marketing automation solution on the market! http://www.aweber.com/?373860

Build high converting sales funnels with a few simple clicks of your mouse! https://bit.ly/484YV29

Join my Patreon for one-on-one coaching and help with your coding…https://www.patreon.com/c/TyronneRatcliff

Buy me a coffee ☕️https://buymeacoffee.com/tyronneratcliff

{ 0 comments }