JavaScript Class Inheritance
Class inheritance is a fundamental concept in object-oriented programming that allows a class to inherit properties and methods from another class. In JavaScript, this is achieved using the extends keyword, which enables one class (the subclass) to inherit from another class (the superclass). This concept promotes code reuse and helps organize complex systems by breaking them into hierarchical relationships.
1. Basic Class Inheritance in JavaScript
In JavaScript, when one class inherits from another, the subclass gains access to the properties and methods of the superclass. The super() function is used within the subclass to call the constructor of the superclass.
Example of Class Inheritance
class Animal {
constructor(name) {
this.name = name;
}
// Method in the parent class
speak() {
return `${this.name} makes a sound.`;
}
}
// Subclass inheriting from Animal
class Dog extends Animal {
constructor(name, breed) {
// Call the parent class constructor using super()
super(name);
this.breed = breed;
}
// Overriding the speak() method
speak() {
return `${this.name}, the ${this.breed}, barks.`;
}
}
// Creating an instance of the subclass
const dog = new Dog("Rex", "German Shepherd");
console.log(dog.speak()); // Output: Rex, the German Shepherd, barks.
In this example, the Dog class extends the Animal class, inheriting the name property and the speak() method. The speak() method is overridden in the Dog class to provide a specific behavior for dogs.
2. The super() Keyword
The super() keyword is used to call the constructor of the superclass within the subclass. This is necessary when the subclass needs to pass arguments to the parent class constructor, as demonstrated in the previous example.
Using super() in Class Inheritance
class Vehicle {
constructor(type, speed) {
this.type = type;
this.speed = speed;
}
move() {
return `${this.type} moves at ${this.speed} km/h.`;
}
}
class Car extends Vehicle {
constructor(type, speed, brand) {
// Call the parent class constructor
super(type, speed);
this.brand = brand;
}
details() {
return `The ${this.brand} ${this.type} moves at ${this.speed} km/h.`;
}
}
const car = new Car("Sedan", 120, "Toyota");
console.log(car.details()); // Output: The Toyota Sedan moves at 120 km/h.
In this example, the Car class uses the super() keyword to call the constructor of the Vehicle class, allowing it to inherit the type and speed properties.
3. Overriding Methods
In JavaScript, a subclass can override methods of the superclass by defining methods with the same name in the subclass. This is useful when you want to provide a specialized implementation of a method for the subclass.
Overriding a Method in a Subclass
class Bird {
constructor(name) {
this.name = name;
}
fly() {
return `${this.name} flies high.`;
}
}
class Penguin extends Bird {
// Overriding the fly method
fly() {
return `${this.name} cannot fly, but swims instead.`;
}
}
const penguin = new Penguin("Pablo");
console.log(penguin.fly()); // Output: Pablo cannot fly, but swims instead.
In this example, the Penguin class overrides the fly() method inherited from the Bird class, providing a specific behavior for penguins.
4. Inheriting Static Methods
Static methods in a superclass are also inherited by subclasses. Static methods are called on the class itself rather than on instances of the class. The subclass can call the inherited static methods, or it can override them as needed.
Inheriting Static Methods Example
class Calculator {
static add(a, b) {
return a + b;
}
}
class AdvancedCalculator extends Calculator {
static subtract(a, b) {
return a - b;
}
}
console.log(AdvancedCalculator.add(5, 3)); // Output: 8
console.log(AdvancedCalculator.subtract(5, 3)); // Output: 2
In this example, the AdvancedCalculator class inherits the static add() method from the Calculator class and adds its own static subtract() method.
5. Class Inheritance with Getters and Setters
Getters and setters can also be inherited by subclasses. They allow controlled access to properties in both the superclass and the subclass.
Using Getters and Setters in Inheritance
class Shape {
constructor(name) {
this._name = name;
}
get name() {
return this._name;
}
set name(newName) {
this._name = newName;
}
}
class Circle extends Shape {
constructor(name, radius) {
super(name);
this.radius = radius;
}
get area() {
return Math.PI * this.radius * this.radius;
}
}
const circle = new Circle("My Circle", 10);
console.log(circle.name); // Output: My Circle
console.log(circle.area); // Output: 314.159...
In this example, the Circle class inherits the name getter and setter from the Shape class. It also introduces a new getter, area, to calculate the area of the circle.
Conclusion
Class inheritance in JavaScript allows for better code reuse and organization by enabling classes to share properties and methods. By leveraging the extends keyword, subclasses can inherit and extend the functionality of superclasses, override methods, and define their own behavior. This feature is a key part of object-oriented programming in JavaScript and is essential for writing scalable and maintainable code.
Comments
Post a Comment