Cách sử dụng Javascript Classes

1
Dịch vụ dạy kèm gia sư lập trình

Javascript là ngôn ngữ lập trình dựa trên nguyên mẫu (prototype-based language). Và tất cả các object trong Javascript có một thuộc tính ẩn gọi là Prototype, nó cho phép bạn mở rộng các thuộc tính và method của một Object. Bạn có thể đọc thêm bài viết này: Object Prototype Javascript – Công cụ hỗ trợ OOP cho JS.

Mặc dù trong bản đặc tả ES6, họ đã cố gắng để JS có thể hỗ trợ lập trình hướng đối tượng bằng việc cho ra khái niệm Class. Tuy nhiên, Class trong javascript không thực sự đúng ý nghĩa như trong các ngôn ngữ OOP như Java, C#…

Để các bạn hiểu rõ hơn về Javacript Class , xem nó khác với khái niệm Class trong Java, C#… như thế nào? Cách sử dụng ra sao?

Mời các bạn đọc bài viết này nhé.

Bản chất Class trong Javascript là một hàm

Theo một cách hiểu thì javascript class là một kiểu của hàm. Một class được định nghĩa với từ khóa class thay vì function.

Dưới đây là hai ví dụ về các định nghĩa một hàm và một class.

// Initializing a function with a function expression
const day_la_ham = function() {}

// Initializing a class with a class expression
const day_la_class = class {}

Bạn có thể truy xuất vào Prototype của một object thông qua hàm: Object.getPrototypeOf()

Giờ chúng ta sẽ thử với hàm rỗng vừa tạo ở trên nhé.

Object.getPrototypeOf(day_la_ham);

Output
ƒ () { [native code] 

Kết quả tương tự nếu bạn thử với class day_la_class vừa tạo ở trên.

Đoạn code khai báo với cả hai từ khóa function và function đều trả về một function [[Prototype]]. Với Prototypes thì bất kỳ hàm nào cũng trở thành hàm khởi tạo một đối tượng thay vì phải sử dụng từ khóa new.

const x = function() {}

// Initialize a constructor from a function
const constructorFromFunction = new x();

console.log(constructorFromFunction);

//Output
x {}
constructor: ƒ ()

Tương tự với class:
const y = class {}

// Initialize a constructor from a class
const constructorFromClass = new y();

console.log(constructorFromClass);

//Output
y {}
constructor: class

Định nghĩa một Class

Ngoài cách định nghĩa một class kiểu như hàm ở trên, bạn có thể sử dụng constructor để định nghĩa các thuộc tính của class.

// Initializing a class definition
class Hero {
    constructor(name, level) {
        this.name = name;
        this.level = level;
    }
}

Viết các method trong class

Việc định nghĩa các method trong một class cũng rất đơn giản, giống như các ngôn ngữ khác thôi.

    constructor(name, level) {
        this.name = name;
        this.level = level;
    }

    // Adding a method to the constructor
    greet() {
        return `${this.name} says hello.`;
    }
}

Để tạo một instance của một class, chúng ta dùng từ khóa new và gán giá trị cho một biến.

const hero1 = new Hero('Varg', 1);

Nếu chúng ta thử in những thông tin trong biến vừa nhận được bằng lệnh: console.log(hero1). Bạn có thể thấy chi tiết các thông tin và hiểu được điều gì đang xảy ra.

Output
Hero {name: "Varg", level: 1}
__proto__:
  ▶ constructor: class Hero
  ▶ greet: ƒ greet()

Kế thừa một class

Mục đích của người ta khi nhồi nhét khái niệm Class vào Javascript đó chính là để hạn chế việc phải lặp lại code quá nhiều. Cũng giống như các ngôn ngữ khác, người ta muốn tái sử dụng code Js càng nhiều càng tốt.

Các hàm constructor có thể được tạo từ class cha bằng cách sử dụng hàm call(). Trong ví dụ dưới đây, mình sẽ tạo thêm một class Mage, sẽ kế thừa các thuộc tính  từ class Hero.

// Creating a new constructor from the parent
function Mage(name, level, spell) {
    // Chain constructor with call
    Hero.call(this, name, level);

    this.spell = spell;
}

Sau này, khi bạn tạo đối tượng instance mới của Mage, nó sẽ mang đầy đủ các thuộc tính của Hero cộng thêm thuộc tính mới của chính nó nữa.

const hero2 = new Mage('Lejon', 2, 'Magic Missile');

Bạn thử in thông tin của đối tượng hero2 bằng lệnh console.log(hero2) mà xem.

Output
Mage {name: "Lejon", level: 2, spell: "Magic Missile"}
__proto__:
    ▶ constructor: ƒ Mage(name, level, spell)

Từ ES6, bạn sẽ thấy cú pháp kế thừa được thiết kế gần giống với Java. Tức là sử dụng từ khóa extends, và super().

// Creating a new class from the parent
class Mage extends Hero {
    constructor(name, level, spell) {
        // Chain constructor with super
        super(name, level);

        // Add a new property
        this.spell = spell;
    }
}

Tạm kết

Qua bài viết này, chúng ta đã hiểu được bản chất và cách định nghĩa, sử dụng Class trong javascript. Hiểu về cách kế thừa trong class cũng là cách để viết code hiểu quả hơn. Việc làm quen với Class trong JS là việc vô cùng cần thiết. Vì sao như vậy?

Vì các frameworks, thư viện hiện đại như React, Vue… sử dụng class rất nhiều.

Các bạn cảm nhận thế nào về class trong JS? Để lại dưới phần bình luận bên dưới nhé.

💥 Đọc thêm:

Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trướcLàm việc với Date/Time trong Javascript – Tưởng dễ mà khó không tưởng
Bài tiếp theoReactJS – Khi nào cần sử dụng tới useCallback?
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

1
Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
Toàn
Guest
Toàn

JavaScript mà dùng class thấy cũng vui phết. Kiểu nửa mùa so với Java 🙂