Understanding Javascript : Function Contructors and '.prototype''
Ở bài trước mình đã giới thiệu với các bạn về cách build một object bằng Contructor Function (thiết lập các prototype cho object) nhưng mình chưa nói làm cách nào để thiết lập prototype ? đây là một khía cạnh quan trọng khác khi bạn xây dựng một object bằng js.
Ví dụ :
Khi bạn sử dụng toán tử New trước một hàm (với điều kiện hàm này không trả về bất kì object nào) thì điều đầu tiên : toán tử new sẽ tạo ra một object rỗng tiếp theo khi hàm được gọi EC được tạo ra và biến this của EC này sẽ trỏ đến object rỗng được tạo ra => điều đó dẫn đến việc mọi thứ được viết đằng sau dấu . của this đều là property của object rỗng đó.
Kết quả :
Bạn thấy rằng sự khác biệt khi mình tạo object bằng 2 cách khác nhau , khi log ra _proto của từng object
- Trong proto của John có một proto khác trong khi của nguoi không có.
Để giải thích điều này bạn cần nhớ lại , một funtion bản chất là một object đặc biệt nó có thêm vài property đặc biệt là :
- name (không có cũng được)
- code(nó nắm giữa tất cả code của bạn , giúp code được thực thi khi bạn gọi hàm này )
- Prototype là một object rổng , trừ khi bạn dùng toán tử new trước hàm này thì property này không bao giờ được sử dụng và bạn chú ý rằng property prototype của Function này nó không phải là prototype của hàm mà nó là prototype của bất cứ object nào bạn tạo bằng Contructor Function.
Khi bạn sử dụng từ khóa new bạn biết rằng nó sẽ tạo ra một object mới và ... nó sẽ thiết lập Prototype rỗng này bằng với Prototype của hàm mà bạn gọi sau toán tử new đó.
=> Như vậy rút ra kết luận rằng
+ Prototye của object mà hàm tạo ra chính là prototype của hàm dẫn đến việc khi chúng ta thêm bất kì property nào vào prototype của hàm sẽ ảnh hưởng đến cả prototype của object
+ Những object được tạo từ cùng một hàm tạo (Contructor Function ) thì prototype của bọn chúng đều tham chiếu đến prototype của hàm đó . (liên hệ với static trong java ,static thì đại diện cho một class chứ nó không đại diện cho object còn Prototype nó đại diện cho một hàm tạo (Contructor Function) chứ không đại diện cho object )
Ví dụ :
Khi bạn sử dụng toán tử New trước một hàm (với điều kiện hàm này không trả về bất kì object nào) thì điều đầu tiên : toán tử new sẽ tạo ra một object rỗng tiếp theo khi hàm được gọi EC được tạo ra và biến this của EC này sẽ trỏ đến object rỗng được tạo ra => điều đó dẫn đến việc mọi thứ được viết đằng sau dấu . của this đều là property của object rỗng đó.
Bạn thấy rằng sự khác biệt khi mình tạo object bằng 2 cách khác nhau , khi log ra _proto của từng object
- Trong proto của John có một proto khác trong khi của nguoi không có.
Để giải thích điều này bạn cần nhớ lại , một funtion bản chất là một object đặc biệt nó có thêm vài property đặc biệt là :
- name (không có cũng được)
- code(nó nắm giữa tất cả code của bạn , giúp code được thực thi khi bạn gọi hàm này )
- Prototype là một object rổng , trừ khi bạn dùng toán tử new trước hàm này thì property này không bao giờ được sử dụng và bạn chú ý rằng property prototype của Function này nó không phải là prototype của hàm mà nó là prototype của bất cứ object nào bạn tạo bằng Contructor Function.
Khi bạn sử dụng từ khóa new bạn biết rằng nó sẽ tạo ra một object mới và ... nó sẽ thiết lập Prototype rỗng này bằng với Prototype của hàm mà bạn gọi sau toán tử new đó.
=> Như vậy rút ra kết luận rằng
+ Prototye của object mà hàm tạo ra chính là prototype của hàm dẫn đến việc khi chúng ta thêm bất kì property nào vào prototype của hàm sẽ ảnh hưởng đến cả prototype của object
+ Những object được tạo từ cùng một hàm tạo (Contructor Function ) thì prototype của bọn chúng đều tham chiếu đến prototype của hàm đó . (liên hệ với static trong java ,static thì đại diện cho một class chứ nó không đại diện cho object còn Prototype nó đại diện cho một hàm tạo (Contructor Function) chứ không đại diện cho object )
Nhận xét
Đăng nhận xét