Trong JavaScript, có hai cách chính để tạo và làm việc với đối tượng: sử dụng class và prototype. Mặc dù cả hai đều được sử dụng để định nghĩa và tạo đối tượng, chúng có những điểm khác biệt quan trọng. Dưới đây là sự khác biệt giữa class và prototype trong JavaScript:
Class
Class là một cú pháp mới hơn được giới thiệu trong ECMAScript 2015 (ES6) để làm việc với các đối tượng theo cách gần giống với các ngôn ngữ lập trình hướng đối tượng truyền thống như Java hay C++. Tuy nhiên, class trong JavaScript vẫn chỉ là một lớp cú pháp bọc quanh cơ chế prototype của ngôn ngữ.
Đặc điểm của Class
- Cú pháp gọn gàng và dễ hiểu: Class cung cấp một cách định nghĩa đối tượng dễ đọc và dễ hiểu hơn so với cách làm việc trực tiếp với prototype.
- Constructor: Class sử dụng một hàm constructor để khởi tạo đối tượng.
- Kế thừa: Class hỗ trợ kế thừa thông qua từ khóa
extends
.
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(); // Output: Rex barks.
Prototype
Prototype là cơ chế cốt lõi của JavaScript để làm việc với đối tượng và kế thừa. Mỗi đối tượng trong JavaScript có một thuộc tính ẩn gọi là [[Prototype]]
, mà có thể được truy cập thông qua __proto__
hoặc Object.getPrototypeOf()
.
Đặc điểm của Prototype
- Nguyên tắc cốt lõi của JavaScript: Prototype là nền tảng của hệ thống đối tượng trong JavaScript.
- Kế thừa thông qua prototype chaining: Các đối tượng có thể kế thừa các thuộc tính và phương thức từ prototype của chúng.
- Dynamically add properties and methods: Các thuộc tính và phương thức có thể được thêm vào prototype sau khi đối tượng đã được tạo ra.
Ví dụ
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name} makes a noise.`);
}
function Dog(name) {
Animal.call(this, name); // Gọi constructor của Animal
}
Dog.prototype = Object.create(Animal.prototype); // Kế thừa từ Animal
Dog.prototype.constructor = Dog;
Dog.prototype.speak = function() {
console.log(`${this.name} barks.`);
}
const dog = new Dog('Rex');
dog.speak(); // Output: Rex barks.
So sánh Class và Prototype
-
Cú pháp:
- Class: Cung cấp cú pháp gọn gàng, dễ đọc và quen thuộc với những người từ các ngôn ngữ lập trình hướng đối tượng truyền thống.
- Prototype: Đòi hỏi cú pháp phức tạp hơn và hiểu sâu hơn về cơ chế kế thừa của JavaScript.
-
Kế thừa:
- Class: Sử dụng từ khóa
extends
và từ khóasuper
để gọi constructor của lớp cha. - Prototype: Sử dụng cơ chế chaining và gọi hàm constructor của lớp cha một cách thủ công.
- Class: Sử dụng từ khóa
-
Khả năng thêm thuộc tính và phương thức:
- Class: Mặc dù cú pháp class không khuyến khích việc thêm thuộc tính và phương thức sau khi đối tượng được tạo ra, bạn vẫn có thể làm điều này bằng cách truy cập prototype.
- Prototype: Dễ dàng thêm thuộc tính và phương thức vào prototype của đối tượng sau khi đối tượng được tạo ra.
Kết luận
Class và prototype đều là cách để làm việc với đối tượng trong JavaScript, nhưng class cung cấp một cú pháp dễ hiểu và gần gũi hơn với lập trình hướng đối tượng truyền thống, trong khi prototype là cơ chế cốt lõi và mạnh mẽ hơn của ngôn ngữ. Hiểu và sử dụng cả hai cách sẽ giúp bạn linh hoạt hơn trong việc lập trình JavaScript.
Comments