Prototype là gì? Để làm gì? Ngon không, ăn được không, sexy không, :D
Vâng bạn nào có ý nghĩ về
prototype như vậy thì có thể dừng ngay nó tại đây đi nhé bởi vì prototype nó
còn Siệc xy lấy đì hơn thế nữa đó nhé. !!!.
Nói vậy thôi dưới bài học này mình
sẽ cùng các bạn tìm hiểu về một khái niệm rất quan trọng trong javascript là
prototype dưới góc nhìn sinh học (sinh mình còn kém lắm lên chỉ dưới mức hình
dung mong nghĩa hiệp sinh học chém nhẹ tay).
Protoype là bộ mặt hay nói nôm na là cha của một đối tượng. Có thể hiểu nếu muốn tìm một thuộc tính trong đối tượng mà bản thân nó không làm được nó sẽ dùng prototype để tìm tới thuộc tính ở lớp cha của nó, lớp cha của nó không thấy thì tìm tiếp cho tới lớp ông, cụ, kỵ tổ tiên tông môn nhà nó, nếu mọi kết quả từ cha của nó không tìm thấy thì ta sẽ làm 1 việc hết sức đơn giản đó là:
console.log("Méo tìm thấy!");
Trong sinh học protoype lớn nhất là các nhiễm sắc thể, có thể nói mọi
sinh vật được bắt nguồn từ đây. Tìm NST AA của thằng con (kq: không thấy) =>
tìm tiếp cha của nó không thấy (đặt nghi vấn) => tìm tiếp tới prototype ông
nội của nó, cứ như vậy cho tới khi tới hết cả họ hàng nhà nó thì thôi, thực ra
ngoài đời tìm tới cha của nó mà không thấy là có thể kết luận và in ra ngoài
màn hình ngay
console.log('Con ông hàng xóm');
Trong javascript protoype lớn nhất là Object.prototype. Chung quy mọi
đối tượng đều quy về object prototype này, ngoại trừ undefine và null .
Function là vô đối hấu như nhất hết
xong cũng chỉ là hậu thế của Function.protoype. Nhưng cũng phải nói rất tiếc là
Function.prototype cũng chỉ là hậu thế của Sư tổ Object.protoype mà thôi
Object.getPrototypeOf(Function) === Function.prototype // true
Vậy cũng đủ hình dung được hiểu về
prototype cũng phần nào giúp bổ xung các nhược điểm cho các hậu thế sau học
hỏi. Có thể liên hệ ngay protoype với đời sống thực là nếu Ông, cha có quyền
lực thì đời hậu thế con cái sau cũng phải có quyền lực (chỉ tính ở VN thôi nhé)
Lấy ví dụ đơn giản như mẫu gen ham
rượu từ thằng cha
function ThangCha(){ this.hamRuou = function () { console.log('Ham ruou che!'); } } var ThangCon = new ThangCha(); console.log(ThangCon.hamRuou());// Ham ruou che!
Ham rượu thì chưa là gì với thanh
niên thời nay và thằng cha cũng nằm trong số đó, vì vậy ta thêm tính Gen ham
gái cho thằng cha nó
ThangCha.prototype.hamGai = function () { console.log('Ham gai! Thich gai xinh va hien diu :3 !') };
Như chúng ta khai báo ở trên thì
ThangCon là con của thằng cha, hay nói cách khác nó là 1 thể hiện của thằng cha
(instance của constructor Wife) vì
vậy cha nào con đó thằng con đương nhiên sẽ được hưởng gen ham gái từ thằng cha.
Dễ dàng kiểm tra lại kết quả ham gái từ thằng con
ThangCon.hamGai(); //Ham gai! Thich gai xinh va hien diu :3 !
Và đương nhiên muốn cho hậu thế
nhiều gen hơn nữa thì ta có thể cấy vào gen thằng cha nhiều hơn các gen nữa
(bằng cách thêm vào các thuộc tính cho ThangCha của nó). Ta sẽ thử bổ xung cho
thằng cha gen biết quay tay và quay chân.
ThangCha.prototype.quayTay = function () {
console.log('Cha biết quay tay này! Con cũng thế nhé!');
};
ThangCha.prototype.quayChan = function () {
console.log('Cha mày biết cả quay chân nữa nhé!');
};
ThangCon.quayTay(); //Cha biết quay tay này! Con cũng thế nhé!
ThangCon.quayChan(); //Cha mày biết cả quay chân nữa nhé!
console.log('Cha biết quay tay này! Con cũng thế nhé!');
};
ThangCha.prototype.quayChan = function () {
console.log('Cha mày biết cả quay chân nữa nhé!');
};
ThangCon.quayTay(); //Cha biết quay tay này! Con cũng thế nhé!
ThangCon.quayChan(); //Cha mày biết cả quay chân nữa nhé!
Object.create(null):tất nhiên hẳn các ông bố ăn chơi, đủ các thói xấu này hay những bà mẹ không
hề muốn thằng con mình xinh ra thừa hưởng những gen này. Tuy nhiên ông, cha hay cố nội của nó không phải
lo lắng nữa vì trong prototype đã hỗ trợ chúng tạo ra gen thuần khiết, có thể nói là nó thuần khiết đến lỗi
ThangCon nó khác hoàn toàn ThangCha mà không chưa lấy 1 cái gen chung luôn (ngoài đời có thể coi thằng này
là ThangConHangXom :v );
var ThangCon2 = ThangCha.create(null);
ThangCon2.quayTay(); //Uncaught TypeError: ThangCha.create is not a function
ThangCon2.quayChan(); //Uncaught TypeError: ThangCha.create is not a function
ThangCon2.quayTay(); //Uncaught TypeError: ThangCha.create is not a function
ThangCon2.quayChan(); //Uncaught TypeError: ThangCha.create is not a function
=> Vậy là nhờ prototype ThangCha
đã không phải lo lắng về sản phẩm sắp tới của nó vì nó đã tạo ra ThangCon2 là
hoàn toàn trong trắng chẳng những khác anh trai nó là ThangCon mà nó còn khác
luôn cả cha nó là ThangCha (vâng nếu ko muốn nói nó là sản phẩm của ông hàng
xóm hay 1 sự siêu đột biên gen có 1 không 2 trong sinh học :3 )
Kết luận: Sử dụng prototype
là rất hữu ích trong khi bạn viết ứng dụng javascript, nó hữu dụng khi bạn có
thể muốn thêm bất cứ 1 hành vi hay xử lý vào lớp cha của nó để toàn bộ các lớp
con kế thừa, được tạo ra từ nó có thể sử dụng lại toàn bộ các hành vi bổ xung
đó !!!
Gợi ý trong C#: Đây là tính năng
tương tự với Extension method trong ngôn ngữ lập trình C# (Bởi vì mình là một
.Net develope chính gốc mới chuyển qua javascript).
Liên kết tham khảo:
http://kipalog.com/posts/prototype-la-khi-gi-
https://toidicodedao.com/2016/02/02/series-javascript-sida-po-ro-to-tai-prototype-la-cai-gi/