Hiểu về Prototype dưới góc nhìn sinh học

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é!
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

=> 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/