JavaScript Classes in 2026: Methods vs Functions
Updated on December 28, 2025 5 minutes read
JavaScript classes give you a structured way to create objects with shared behavior.
If you already know functions and objects, classes mostly add clarity by grouping data and behavior into a single, readable unit.
In 2026, class syntax is a standard part of modern JavaScript (introduced in ES2015).
It is widely used across applications and libraries, while still relying on prototype-based inheritance under the hood.
What a JavaScript Class Is (and What It Is Not)
A class is a template for creating objects (instances). It can define a constructor to set up the initial state, plus methods that each instance can call.
One key detail: class does not introduce a new inheritance model. It is syntax that maps to constructors and prototypes, so learning prototypes makes classes feel far less mysterious.
What you typically put in a class
Most classes in real projects contain a small set of building blocks:
- Constructor: runs when you create an instance with
new. - Instance methods: shared functions living on the prototype.
- Static methods: utility functions that belong to the class itself.
- Fields: public or private values stored on each instance.
Functions, Object Methods, and Class Methods
JavaScript uses the same core idea everywhere: functions are values. The main difference lies in where you store a function and how you call it.
Regular functions
A regular function is standalone. You call it by name, and it does not automatically have an object context unless you explicitly provide one.
function greet(name) {
return `Hello, ${name}!`;
}
greet('John'); // "Hello, John!"
Methods on plain objects
When you assign a function to an object property, it becomes a method. Methods can use this to access other properties on the same object, as long as they are called with the object on the left side of the dot.
const person = {
name: 'John',
greet() {
return `Hello, ${this.name}!`;
}
};
person.greet(); // "Hello, John!"
Instance methods and static methods in classes
Methods you write inside a class body (without static) become instance methods. They are stored on ClassName.prototype, which means all instances share the same function implementation.
Static methods (with static) live on the class itself. They are useful for helpers like parsing, validation, or small utilities that do not depend on one instance.
class Person {
constructor(name) {
this.name = name;
}
greet() {
return `Hello, ${this.name}!`;
}
static isPerson(value) {
return value instanceof Person;
}
}
const john = new Person('John');
john.greet(); // "Hello, John!"
Person.isPerson(john); // true
Tip: The phrase “class method” is often used informally to mean a static method.
If you mean a method available on instances, say “instance method”.
One Example in Three Styles
Here is the same “greet a user” behavior written as a function, an object method, and a class with an instance method plus a static helper.
// 1) Regular function
function greet(name) {
return `Hello, ${name}!`;
}
// 2) Object method
const userObject = {
name: 'Ada',
greet() {
return `Hello, ${this.name}!`;
}
};
// 3) Class (instance + static)
class User {
constructor(name) {
this.name = name;
}
greet() {
return `Hello, ${this.name}!`;
}
static fromJSON(json) {
const data = JSON.parse(json);
return new User(data.name);
}
}
// Usage
greet('Ada'); // "Hello, Ada!"
userObject.greet(); // "Hello, Ada!"
new User('Ada').greet(); // "Hello, Ada!"
User.fromJSON('{"name":"Ada"}').greet(); // "Hello, Ada!"
How this Works (and Why It Sometimes Breaks)
In JavaScript, this is decided by how a function is called, not where it is defined. That is why methods can lose this when you pass them around. A common pitfall looks like this:
const user = {
name: 'John',
greet() {
return `Hello, ${this.name}!`;
}
};
const fn = user.greet;
fn(); // `this` is undefined in strict mode (or the global object in sloppy mode)
Practical fixes you can use:
- Call the method with the object:
user.greet(). - Bind the function once:
const fn = user.greet.bind(user). - Wrap it for callbacks:
() => user.greet()(handy for event handlers).
Modern Class Features You Will See in 2026
Many codebases now use class fields and private fields for cleaner state management and stronger encapsulation. Private fields start with # and are only accessible inside the class:
class Counter {
#value = 0;
increment() {
this.#value += 1;
return this.#value;
}
}
const c = new Counter();
c.increment(); // 1
// c.#value; // Syntax error: private field is not accessible here
Use private state when it helps you protect invariants. If it makes testing or interoperability harder, a well-documented public API can be a better choice.
When Classes Are a Good Fit
Classes are most useful when you need to model something with both state and behavior, and you will create multiple similar instances. They can be a strong choice for:
- Domain models (users, carts, invoices) with clear responsibilities
- UI components or services where shared methods reduce duplication
- Codebases where a consistent OOP style improves readability
For small one-off structures, a plain object or a few functions may be simpler.
Keep Going with Code Labs Academy
If you are building confidence in JavaScript fundamentals, practicing classes, objects, and this in real projects makes the concepts stick.
Explore the Web Development Bootcamp to see the skills you will build, and if you are ready to start, you can apply here.