7.1 Cơ bản về thừa kế
Thừa kế lớp trong JavaScript cho phép tạo các lớp mới dựa trên các lớp đã tồn tại, sử dụng lại và mở rộng chức năng của chúng. Đây là một khía cạnh quan trọng của lập trình hướng đối tượng, cho phép tạo ra các hệ thống phân cấp lớp và quản lý hành vi của đối tượng.
Để thừa kế lớp, sử dụng từ khóa extends
. Lớp kế thừa từ lớp khác được gọi là
lớp dẫn xuất (subclass), và lớp được thừa kế được gọi là lớp cơ sở (superclass).
Ví dụ:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
Giải thích:
- Lớp
Animal
là lớp cơ sở với constructor và phương thứcspeak()
- Lớp
Dog
kế thừaAnimal
và ghi đè phương thứcspeak()
- Thể hiện
dog
của lớpDog
sử dụng phương thứcspeak()
đã bị ghi đè
7.2 Từ khóa super
Từ khóa super
được sử dụng để gọi constructor hoặc phương thức của lớp cơ sở từ lớp dẫn xuất.
1. Gọi constructor của lớp cơ sở
Lớp dẫn xuất phải gọi constructor của lớp cơ sở sử dụng super()
trước khi sử dụng this
.
Ví dụ:
Constructor Dog
gọi super(name)
để khởi tạo thuộc tính name của lớp cơ sở Animal
.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex', 'Labrador');
console.log(dog.name); // "Rex"
console.log(dog.breed); // "Labrador"
dog.speak(); // "Rex barks."
2. Gọi phương thức của lớp cơ sở
Phương thức của lớp cơ sở có thể được gọi từ lớp dẫn xuất sử dụng super
.
Ví dụ:
Phương thức speak()
của lớp Dog
gọi phương thức speak()
của lớp cơ sở Animal
sử dụng super.speak()
, sau đó thực hiện logic riêng của mình.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
super.speak(); // Gọi phương thức của lớp cơ sở
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak();
// "Rex makes a noise."
// "Rex barks."
7.3 Thừa kế và ghi đè phương thức
Thừa kế cho phép các lớp dẫn xuất ghi đè phương thức của lớp cơ sở. Điều này cho phép thay đổi hoặc mở rộng chức năng của các phương thức.
Ví dụ:
Phương thức speak()
của lớp Dog
ghi đè phương thức speak()
của lớp cơ sở
Animal
, cung cấp cài đặt riêng của mình.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const animal = new Animal('Generic Animal');
animal.speak(); // "Generic Animal makes a noise."
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
7.4 Thừa kế và phương thức bổ sung
Lớp dẫn xuất có thể thêm các phương thức mới không tồn tại trong lớp cơ sở.
Ví dụ:
Lớp Dog
thêm một phương thức mới fetch()
, không tồn tại trong lớp cơ sở Animal
.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
fetch() {
console.log(`${this.name} is fetching.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
dog.fetch(); // "Rex is fetching."
7.5 Kiểm tra thừa kế
Để kiểm tra thừa kế, có thể sử dụng toán tử instanceof
và phương thức isPrototypeOf()
.
Ví dụ:
Toán tử instanceof
kiểm tra xem một đối tượng có phải là một thực thể của lớp hay không. Phương thức isPrototypeOf()
kiểm tra xem một prototyp có phải là một phần của chuỗi prototype của đối tượng khác hay không.
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(Animal.prototype.isPrototypeOf(Dog.prototype)); // true
GO TO FULL VERSION