+1

Prototype Pattern trong Javascript

Prototype Pattern trong Javascript

Trong một ngôn ngữ linh hoạt như Javascript, bạn có thể áp dụng rất nhiều những pattern khác nhau. Tùy vào từng trừng hợp mà chúng ta có thể áp dụng. Object oriented programing hay OOP thì các bạn đã nghe và sử dụng chúng rất là nhiều rồi. Nhưng mà trong Javascript thì ta còn có một hướng programing khác, gọi là prototype. Giờ hãy cũng thử xem prototype có gì thú vị và những ích lợi khi sử dụng prototype nhé.

Prototype

Pattern này thì được focus vào việc giúp tạo object từ một blueprint có trước, đồng thời những object sau sẽ được thừa kế những method, thuộc tính khác nhau. Tính chất này gọi là prototype inheritance. Khi tạo một object trong ES6, bạn đã quen với việc khai báo với class. Trong ES5 thì ta còn có cách khác là function constructor. Giả sử khi viết game ta muốn xây dựng một lớp Warrior như sau:

function Warrior(name) {
    this.name = name
 }
 
 const harryPotter = new Warrior('Harry Potter')
 const ngan = new Warrior('Ngan')
 const snake = new Warrior('Snake')

Với cách trên, 3 chiến binh đã được tạo ra. Chúng cùng chia sẻ với nhau một contructor là Warrior

harryPotter.constructor === ngan.constructor // true
snake.constructor === ngan.constructor // true

console.log(harryPotter.constructor.name) // Warrior

Giả sử, giờ lớp chiến binh ta muốn có những skill khác nhau như bash, slash thì sao

function Warrior(name) {
   this.name = name
   this.hp = 100
   
   this.bash = function(target) {
       target.hp -= 10
   }
       
   this.slash = function(target) {
       target.hp /= 2
   }
}

harryPotter.bash(ngan)
console.log(ngan.hp) // 90
ngan.slash(snake)
console.log(snake.hp) // 50

Giờ cách chiến binh đã có những skill và tha hồ cà khịa lẫn nhau. Nhưng ở đây, mỗi một chiến binh lại có một skill riêng biệt, nhưng rõ ràng, skill này lại giống hệt nhau. Điều này là lãng phí khi mà ta kiểm tra lại

harryPotter.bash === ngan.bash // false
snake.bash === ngan.bash // false

Chính vì thể ta cần một cái gì đó giống như constructor, đó chính là prototype

function Warrior(name) {
    this.name = name
    this.hp = 100
}
 
Warrior.prototype.bash = function(target) {
    target.hp -= 10
}

Warrior.prototype.slash = function(target) {
    target.hp /= 2
}

...

harryPotter.bash === ngan.bash // true
snake.bash === ngan.bash // true

Cách trên cũng tương tự với cách viết như sau

Warrior.prototype = {
    bash: function(target) {
        target.hp -= 10
    },
    
    slash: function(target) {
        target.hp /= 2
     },
}

Conclusion

Tuy nhiên với cách này sẽ làm mất đi constructor Warrrior đó nhé. Trên đây chính là cách mà prototype đã thực hiện khả năng thừa kế và chia sẻ của mình như thế nào trong javascript. Hy vọng các bài tiếp theo mình có thể tiếp tục khám phá nhiều điều thú vị hơn nữa. Cám ơn các bạn đã theo dói

References

https://medium.com/better-programming/the-prototype-pattern-in-javascript-bfe9ff433e6c


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.