Vấn đề về kế thừa từ prototype trong javaScript

  • JavaScript
  • 30 tháng 08 2015
  • bởi Văn Khương
  • 0 Comments

bài viết trước có đề cập đến cách thức của việc kế thừa từ prototype, bài này sẽ bàn thêm về các vấn đề trong cách kế thừa từ prototype, cũng như mở rộng thêm về vấn đề này.

Ngoài việc kế thừa một đối tượng bao gồm constructor và prototype (Như ví dụ trước) thì có thể chỉ kế thừa prototype của đối tượng bằng việc sử dụng Object.create() và nếu muốn kế thừa luôn constructor có thể gọi phương thức call() của constructor cần kế thừa trong constructor của đối tượng được kế thừa. Ví dụ:

function A(){
  this.p1 = 'a1';
}
A.prototype.p2 = 'a2';
function B(){
  A.call(this);
  this.p3 = 'b1';
}
B.prototype = Object.create(A.prototype);
var obj = new B();

Sau đây sẽ gọi đối tượng cần kế thừa như A là "superobject", đối tượng được kế thừa như B là "subobject". Như ví dụ trên có thể thấy nếu không gọi phương thức call() đối tượng A thì B chỉ kế thừa p2 của A, ưu điểm của việc sử dụng này giúp kiểm soát được override các thành phần trong subobject hoặc chỉ kế thừa prototype của superobject. Nhưng khi thực hiện kế thừa từ prototype ta cần chú ý đến vấn đề sau:

Những thành phần prototype của superobject nếu không được subobject tạo lại (bất kể là trong constructor hay prototype) thì những thành phần đó được subobject kế thừa lại và sẽ thay đổi khi superobject có sự thay đổi, và ngược lại nếu thành phần prototype của superobject được subobject tạo lại (kể cả trong constructor hay prototype, kể cả superobject gọi lại thành phần đó lần cuối) thì những thành phần prototype của superobject có thay đổi thì subobject cũng không thay đổi. Tuy nhiên trong nhiều trường hợp chúng ta muốn khi superobject thay đổi sau cùng thì những thành phần subobject cũng thay đổi nhưng với trường hợp này kế thừa sẽ chẳng bao giờ được override và những thành phần đó luôn phụ thuộc vào superobject, hoặc chúng ta chỉ muốn kế thừa lần đầu tiên và không muốn thay đổi khi superobject thay đổi, nếu như vậy thì đơn thuần chỉ là sự sao chép và không có liên quan gì tới superobject đây không thực sự là kế thừa.

Một vấn đề nữa là javaScript không hỗ trợ đa kế thừa, nghĩa là một subobject không kế thừa hoàn toàn từ nhiều superobject thông qua prototype nó chỉ kế thừa đầy đủ với superobject gần nhất mà nó kế thừa

Kết luận cuối cùng khi thực hiện kế thừa từ prototype 1 object chúng ta cần hiểu việc tạo lại một thành phần nào đó có nghĩa là sẽ không còn phụ thuộc vào nó từ superobject nữa và nếu không tạo lại có nghĩa những thành phần đó đang được kế thừa từ superobject, đây là điều quan trọng để hiểu khi instance một new object từ subobject những gì đã làm thay đổi những thành phần trong nó và những gì không.

  • Chia sẻ
comments powered by Disqus