funkcje dziedziczą Function
Jesteś cytując MDN luźno. Co to właściwie mówi się: obiekty
funkcyjne dziedziczą Function.prototype
Należy zauważyć, że na stronie MDN, początkowe słowo „funkcja” w zdaniu są kapitalizowane, ale tylko dlatego, że jest u początek zdania, nie dlatego, że odnosi się do obiektu JS Function
. Odnosi się to do zwykłych starych funkcji zadeklarowanych jako function() { }
.
Pamiętaj, że MDN jest napisany przez zwykłych śmiertelników. Wolałbym, żeby nie używali słów "dziedziczenie" i "dziedziczenie", nie wspominając już o "pochodnych". JS nie ma koncepcji dziedziczenia w ścisłym znaczeniu tego słowa. Jeśli użyjesz tej terminologii, w końcu się pomylisz. To, co ma JS, to prototypy związane z obiektami. Podczas uzyskiwania dostępu do właściwości obiektu, jeśli nie zostanie znaleziony, konsultowany jest prototyp. Jeśli go tam nie odnajdziemy, ponieważ prototyp jest również obiektem z prototypem, konsultowany jest prototyp prototypu i tak dalej w łańcuchu.
Dlatego powyższe zdanie powinno być lepiej napisane jako "obiekty funkcji mają jako swój prototypFunction.prototype
".
Przedmiotem JS Function
nie jest bezpośrednio związany z Function.prototype
, poza faktem, że Function.prototype
jest własnością Function
, a ponieważ obiekt Function
jest sama funkcja, sama ma Function.prototype
jak jego pierwowzór. Jakiekolwiek właściwości mogą, ale nie muszą być obecne na Twoim komputerze, nie mają nic wspólnego z łańcuchem prototypów i nie są przez nikogo dziedziczone.
Po wykonaniu (function() { }).call()
, właściwość/metoda call
jest najpierw sprawdzana na obiekcie funkcji; jeśli tam nie istnieje, tak jak normalnie by nie było, to jest podnoszone na prototypie przypisanym wewnętrznie, gdy funkcja została zadeklarowana, czyli Function.prototype
. Gdzie jeszcze można umieścić metody takie jak call
lub apply
, jeśli nie na Function.prototype
? Co jeszcze nazwałbyś prototypem automatycznie przypisanym do funkcji innych niż Function.prototype
?
Na marginesie zwróć uwagę, że Function.call
rozwiąże poprawnie wewnętrzną funkcję call
. Czemu? Nie dlatego, że tam jest miejsce zamieszkania call
lub ponieważ pochodzi to z funkcji, w których "dziedziczą" zwykłe funkcje "call
", ale ponieważ, jak wspomniałem wcześniej, Function
sam jest funkcją, a zatem ma prototyp na jej prototypie: call
prototypowy łańcuch.
Jaki jest sens Function.prototype
? Dlaczego nie przenieść jego właściwości do Function
i pozostawić niezdefiniowaną Function.prototype
? Zamiast tego funkcje będą pochodzić z Function
.
to właściwość na X stosowana jako prototyp dla obiektów utworzonych za pomocą X jako konstruktora. Dlatego, aby przypisać poprawny prototyp do obiektów utworzonych przy użyciu Function
jako konstruktora (który obejmuje funkcje zadeklarowane jako function x() { }
), prototyp musi być obecny jako właściwość prototype
na Function
.
Wyobrażam sobie, że tak jest, ponieważ właściwości prototypu są współużytkowane przez wszystkie instancje, w przeciwieństwie do właściwości instancji, które są lokalne dla każdej instancji. –
> "Funkcje wywodzą się z funkcji". Wierz, że to jest twoje źródło nieporozumień. Nie wiesz, gdzie dokładnie to przeczytałeś, ale Funkcje nie mogą być wyprowadzone z Funkcji w sensie prototypowym. –
@ nikc.org W porządku, ale dlaczego z 'Function.prototype'? Czy nie są to właściwości naprawdę odziedziczone, jeśli wykonamy 'f.prototype = Function', gdzie' f' jest funkcją? Chodzi mi o to, że jeśli chcesz dziedziczyć z funkcji, wykonaj 'f.prototype = super_f', a nie' f.prototype = super_f.prototype', prawda? – Downvoter