Javascript có phải là một ngôn ngữ hướng đối tượng?

Javascript có phải là một ngôn ngữ hướng đối tượng?

Theo tôi Javascript là một ngôn ngữ hỗ trợ cả OOP(hướng đối tượng) và Functional Language(ngôn ngữ chức năng). Chúng ta có thể viết chương trình theo hướng đối tượng và có thể viêt nhiều function kết hợp lại với nhau để thực thi một chức năng nào đó.

Lập trình hướng đối tượng trong Javascript là một phần trọng tâm, bạn nên dành thời gian cho nó. Các framework hiện nay như Angular, React đều dựa trên tính hướng đối tượng. Hiểu được phần này sẽ giúp bạn học Javascript nhanh hơn và hiểu chương trình sâu hơn.

Bốn tính chất của hướng đối tượng:
– Tính đóng gói(encapsulation)
– Tính trừu tượng(abstraction)
– Tính đa hình(polymorphism)
– Tính thừa kế(inheritance)

Vậy các tính chất này áp dụng vào lập trình hướng đối tượng như thế nào? Cùng xem ví dụ sau nhé 🙂

Ta có các đối tượng Animal, Dog, Cat.

class Animal {
 constructor(name) {
  this.name = name;
 }

 eat() {
  console.log('Animal eats some food');
 }
 
 run() {
  console.log('Animal runs');
 } 
}

class Dog extends Animal {
 constructor(name, color) {
  super(name);
  this.color = color;
 }

 run() {
  console.log('Dog runs');
 }
}

class Cat extends Animal {
 constructor(name, color) {
  super(name);
  this.color = color;
 }

 run() {
  console.log('Cat runs');
 }
}

const dog = new Dog('Kiki','black');
const cat = new Cat('Meo', 'white');

dog.eat();
cat.eat();

Thứ nhất, tính đóng gói cho thấy rằng các thuộc tính(property): name của Animal, color của Dog, Cat đều được che giấu. Chúng ta không thể sửa trực tiếp được. Đó gọi là các thuộc tính nội tại của đối tượng, nó chỉ được cập nhật khi ta cung cấp phương thức(method) để thao tác trên nó. Điều này đảm bảo tính đúng đắn của đối tượng. Các dữ liệu của nó không bị thay đổi một cách lung tung.

Thứ hai, tính trừu tượng được thể hiện khi chúng ta tạo mới một thể hiện(instance) của đối tượng. Chúng ta không cần quan tâm sâu bên trong nó làm những gì. Ví dụ đối tượng Animal, ta chỉ quan tâm nó có thuộc tính name và phương thức eat. Khi tạo một Animal ta truyền dữ liệu, và gọi eat là xong, không cần quan tâm eat được cài đặt như thế nào.

Animal có thuộc tính là name, phương thức là eat. Không cần quan tâm sâu vào phần cài đặt.

Thứ ba, tính đa hình thể hiện khi gọi một phương thức nhưng cách hoạt động là khác nhau. Ví dụ bạn thấy cùng một phương thức run nhưng Dog và Cat thực hiện khác nhau.
Dog in ra console.log(‘Dog runs’) và Cat in ra console.log(‘Cat runs’);

Thứ tư, tính thừa kề thể hiện khi Dog, Cat thừa kế từ Animal. Do đó chúng đều có các thuộc tính, phương thức của Animal.

Leave a Comment