chức năng kế thừa từ Function
Bạn đang trích dẫn MDN lỏng lẻo. Những gì nó thực sự nói là: đối tượng
chức năng kế thừa từ Function.prototype
Lưu ý rằng trên trang MDN, từ ban đầu "chức năng" trong câu trên được viết hoa, nhưng chỉ vì nó là tại bắt đầu câu, không phải vì nó đang đề cập đến đối tượng JS Function
. Nó đề cập đến các hàm cũ thông thường được khai báo là function() { }
.
Hãy nhớ rằng MDN chỉ được viết bởi những người chết. Tôi thích họ không sử dụng từ "kế thừa" và "thừa kế", chưa kể "có nguồn gốc". JS không có khái niệm thừa kế theo nghĩa nghiêm ngặt của từ đó. Nếu bạn sử dụng thuật ngữ này, bạn sẽ kết thúc tự gây nhầm lẫn. JS là gì có nguyên mẫu liên kết với các đối tượng. Khi truy cập một thuộc tính trên một đối tượng, nếu nó không được tìm thấy, nguyên mẫu sẽ được tham khảo. Nếu không tìm thấy ở đó, kể từ khi một nguyên mẫu cũng là một đối tượng với một nguyên mẫu, nguyên mẫu của nguyên mẫu được tư vấn, và như vậy lên chuỗi.
Vì vậy, câu trên sẽ tốt hơn được viết là "đối tượng chức năng có dạng nguyên mẫuFunction.prototype
".
Đối tượng JS Function
không liên quan trực tiếp với Function.prototype
, khác hơn so với thực tế là Function.prototype
là một tài sản của Function
, và, vì đối tượng Function
là chính nó một chức năng, nó chính nó có Function.prototype
như nguyên mẫu của nó. Bất kỳ thuộc tính nào có thể hoặc không thể hiện diện trên Function
hoặc treo trên đó bởi bạn, không có gì liên quan đến chuỗi nguyên mẫu và không được "thừa kế" bởi bất kỳ ai.
Khi bạn làm (function() { }).call()
, thuộc tính/phương pháp call
lần đầu tiên được tìm kiếm trên chính đối tượng hàm; nếu nó không tồn tại ở đó, như bình thường thì không, sau đó nó được nhìn lên trên nguyên mẫu được gán nội tại khi hàm được khai báo, là Function.prototype
. Bạn sẽ đặt phương thức nào khác như call
hoặc apply
nếu không có trên Function.prototype
? Những gì khác bạn sẽ gọi nguyên mẫu tự động được giao cho các chức năng khác hơn là Function.prototype
?
Để sang một bên, lưu ý rằng Function.call
sẽ giải quyết chính xác đến hàm call
bên trong. Tại sao? Không phải vì đó là nơi mà cuộc sống call
, hoặc vì đó là nơi mà các chức năng thông thường "kế thừa" call
, nhưng vì, như tôi đã đề cập trước đó, Function
chính nó là một hàm, và do đó có nguyên mẫu Function.prototype
, call
có thể được tìm thấy trên chuỗi nguyên mẫu.
Điểm của Function.prototype
là gì? Tại sao không di chuyển thuộc tính của nó sang Function
và để Function.prototype
không được xác định? Thay vào đó, các hàm sẽ có nguồn gốc từ Function
.
X.prototype
là thuộc tính trên X được sử dụng làm nguyên mẫu cho các đối tượng được tạo bằng cách sử dụng X làm hàm tạo. Do đó, để gán nguyên mẫu chính xác cho các đối tượng được tạo bằng cách sử dụng Function
làm hàm tạo (bao gồm các hàm được khai báo là function x() { }
), nguyên mẫu phải có mặt là thuộc tính prototype
trên Function
.
Tôi sẽ hình dung rằng đó là vì các thuộc tính mẫu thử được chia sẻ giữa tất cả các cá thể, không giống như các thuộc tính thể hiện cục bộ cho mỗi cá thể. –
> "Chức năng sẽ được bắt nguồn từ Chức năng thay thế". Tin rằng đây là nguồn gây nhầm lẫn của bạn. Không chắc bạn đã đọc chính xác ở đâu, nhưng các hàm không thể được bắt nguồn từ các hàm trong một ý nghĩa nguyên mẫu. –
@ nikc.org Được rồi, nhưng tại sao từ 'Function.prototype'? Hoặc không phải là các thuộc tính thực sự được kế thừa nếu chúng ta thực hiện 'f.prototype = Function', trong đó' f' là một hàm? Ý tôi là, nếu bạn muốn kế thừa từ một hàm bạn làm 'f.prototype = super_f' và không phải' f.prototype = super_f.prototype', phải không? – Downvoter