Javascript: разница между функцией и функцией. Прототип - PullRequest
1 голос
/ 25 октября 2019

Если мы создадим такую ​​функцию, как:

function Rabbit() {}

Мы увидим, что она наследует от того же объекта, который Function наследует от, т. Е.

Rabbit.__proto__ === Function.__proto__

Что это за объект более высокого уровня? Если мы попытаемся войти в систему, это будет выглядеть так: ƒ () { [native code] }. Разве Rabbit не должен наследовать от Function объекта, потому что это функция? Может кто-нибудь объяснить, где я не прав?

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Что это за высший объект?

Это объект, на который ссылается Function.prototype, который также является функцией . Именно здесь функции получают свои свойства и методы от (call, apply, bind, name и length).

Этот прототип объекта объект , на который ссылается Object.prototype, который отвечает за основные свойства и методы объекта, такие как hasOwnProperty и toString, и, поскольку вы использовали его в своем примере, __proto__ (который доступен только через Интернет)функция обратной совместимости; не используйте ее, используйте Object.getPrototypeOf).

Не должно ли Rabbit наследоваться от Function объекта, потому что это функция?

Нет, для этого Function.prototype.

Давайте ненадолго отложим Function, в частности. Предположим, у вас есть:

function Thingy() {
}

и

let t = new Thingy();

Object.getPrototypeof(t) === Thingy.prototype будет истинным, потому что когда вы используете new Thingy, результирующий объект получает объект, на который Thingy.prototype указываеткак его прототип. Вот как функции конструктора и прототипы работают в JavaScript.

Function - конструктор, который создает функции. Таким образом, эквивалент будет:

let Rabbit = new Function();

Object.getPrototypeOf(Rabbit) === Function.prototype верно. Это также относится к функциям, которые, подобно вашему Rabbit, не создаются с помощью new Function.

1 голос
/ 25 октября 2019

Разве Кролик не должен наследовать от объекта Function, потому что это функция?

Нет, потому что это обычная функция. Каждая функция, которую вы создаете таким образом, на самом деле является Function экземпляром объекта. См. mdn .

Чтобы сделать Function прототипом вашего объекта, вам нужно явно указать его как прототип вашего объекта и создать экземпляр с помощью ключевого слова new.

...