Является ли функция действительно объектом - PullRequest
3 голосов
/ 15 октября 2010

Я веб-разработчик-самоучка и все еще пытаюсь разобраться с некоторыми основами JavaScript. Ниже приведены некоторые цитаты из «Хороших частей» Дугласа Крокфорда.

«Функции в JavaScript - это объекты»

"В JavaScript массивы - это объекты, функции - это объекты, регулярные выражения - это объекты, и, конечно, объекты - это объекты"

«Каждый объект связан с объектом-прототипом, от которого он может наследовать свойства» (а именно constructor, toString, ...)

Если функция является объектом, то почему

 console.log(typeof Function);  // function 

- это тип функции, а не объекта

 console.log(Object.constructor);  // Function()

это конструктор своего 'родителя'

 console.log(Function.constructor);  // Function()

озадачен так что конструктор фактически является функцией?

 console.log(typeof Function.prototype); // Function

является ли тип прототипа функцией, а не объектом? я думал, что он унаследован от объекта

Ответы на эти вопросы очень помогут моему пониманию JavaScript.

Ответы [ 5 ]

9 голосов
/ 15 октября 2010

Если функция является объектом, то почему ее тип является функцией, а не объектом?

Поскольку оператор typeof определен так, вероятно, для удобства использования:

  • Объект (родной и не реализующий [[Call]]) возвращает «объект»
  • Объект (нативный или хост и реализует [[Call]]) возвращает «функцию»
  • Объект (хост и не реализует [[Call]]) возвращает значение, определенное реализацией, которое не может быть «undefined», «boolean», «number» или «string».

[[Call]] является внутренним свойством объекта, которое идентифицирует объект как функцию (вызываемый). Не родной объект - это объект, предоставленный хостом (например, браузером), такой как объект DOM или экземпляр ActiveXObject.

озадачен, так что конструктор фактически является функцией?

Почему бы не быть? Конструкторы являются функциями. Экземпляры могут быть построены только с использованием функций. Object.constructor это функция, но это также и объект. Смотрите следующее:

console.log((function () { }) instanceof Object);
//-> true

Также из спецификации ECMAScript:

Каждая встроенная функция и каждый встроенный конструктор имеет объект-прототип Function, который является начальным значением выражения Function.prototype (15.3.4), в качестве значения его внутреннего свойства [[Prototype]].

Если не указано иное, каждый встроенный объект-прототип имеет объект-прототип Object, который является начальным значением выражения Object.prototype (15.2.4), в качестве значения его внутреннего свойства [[Prototype]], кроме Сам объект-прототип объекта.

А также, чтобы ответить на ваш последний вопрос:

Объект-прототип Function сам по себе является объектом Function (его [[Class]] равен «Function»), который при вызове принимает любые аргументы и возвращает неопределенное значение.

4 голосов
/ 15 октября 2010

Когда мы говорим «функция - это объект», мы не подразумеваем «есть», как в «вместо», мы подразумеваем это в том же смысле, что и «кошка - животное». Если бы кто-то спросил вас, какое у вас домашнее животное, вы бы не ответили «животное». typeof было бы бесполезно, если бы оно всегда отвечало object.

Функция - это объект, но возвращать typeof неинтересно, поскольку это статическое качество самого языка, а не то, о чем нужно сообщать во время выполнения.

1 голос
/ 15 октября 2010

Оператор typeof был бы совершенно бесполезным, если бы он всегда возвращал «объект», не так ли? Все является объектом, но это могут быть и другие вещи. Например, строка - это объект, но это также и строка :). Оператор возвращает имя наиболее специфического, так сказать, не самого общего типа. Это должно объяснить, почему typeof Function является «функцией».

Что касается свойства constructor, то конструктор - это функция, которая вызывается оператором new при создании объекта. Это всегда функция, независимо от того, является ли сам объект Object, Function или чем-то еще.

0 голосов
/ 18 августа 2011

ссылка Является ли каждый объект JavaScript функцией?

javascript:alert([ window.navigator.userAgent, Object, Function ].join("\n\n") )

отображает

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 
      Ubuntu/10.04 (lucid) Firefox/3.6.3

function Object() {
    [native code]
}

function Function() {
    [native code]
}

также

javascript:alert([ new Object, new Function ].join("\n\n") )

отображает

[object Object]

function anonymous() {  }

и

javascript:alert([ new new Function ].join("\n\n") )

дисплеи

[object Object]
0 голосов
/ 15 октября 2010

console.log(typeof Function); показывает, что объект имеет тип Function, а не object.

Чтобы дать вам пример:

function squareValue(var x) {
    return x * x;
}

можно свободно перевести как

var squareValue = new Function("x", "return x*x");

и, таким образом, делая

var valueSquared = squareValue(x);

в любом из этих 2 примеров даст те же результаты ...

Следовательно, почему каждая функция в Javascript является объектом Function.

.constructor, .prototype, .toString на объекте / функции javascript - это все функции в их соответствующих объектах, поэтому вы выводите их как «функция».

Основано на ECMA-262, 3-е издание, декабрь 1999 г.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...