Почему некоторые конструкторы JavaScript не являются функциями? - PullRequest
9 голосов
/ 09 августа 2011

Пояснение:
"Конструктор JavaScript" должен быть более правильно написан как "конструктор javascript", чтобы подчеркнуть, что рассматриваемые конструкторы являются не только родными конструкторами языка JavaScript, такими как Object, Array, Function и т. Д., Но такжедругие, внешние по отношению к определению языка JavaScript, но присущие браузеру, такие как XMLHttpRequest. Слово «JavaScript» предназначено для обозначения того, что эти конструкторы выражаются и доступны с использованием JavaScript.

некоторые ссылки:

Риторически, есть ссылки на конструктор функции , но НЕ на конструктор objects !

(Фактически, это потому, что Objects являются функциями, а функции являются объектами!
Почему в JavaScript функция считается и конструктором, и объектом?
Точнее говоря, объекты, или это obj-eggs ?, ARE, игнорирующие буквальные экземпляры, экземпляры функций и функций, являются объектными экземплярами функций.Можно утверждать, что функции являются основополагающими для существования объектов, о чем свидетельствует факт
7. Функции
предшествует
8. Работа с объектами
в документах MDN Руководство по JavaScript .В этом разделе 8 «Я возражаю!» Приводятся подробности, необходимые для создания объектов с использованием конструкторов и экземпляров функций!)

Почему конструкторы, взаимодействующие с DOM, не функционируют?

javascript:
  alert([
    "using browser environment:  \n"+window.navigator.userAgent,
     Option, Image, Audio,
       Storage, XMLHttpRequest, Worker, FileReader,
   ] . 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

[опция объекта]

[изображение объекта]

[аудио объекта]

[хранилище объектов]

[объект XMLHttpRequest]

[объект Worker]

[объект FileReader]

но ...

javascript:
  alert([
             XPCNativeWrapper,
  ].join("\n\n"));

(который производит

function XPCNativeWrapper () {[собственный код]}

)

и язык JavaScript конструкторы функции ARE.

javascript:
  alert([
    "using browser environment:  \n"+window.navigator.userAgent,
             Array, Boolean, Date, Function,
               Number, Object, RegExp, String,
                 Error, Iterator,
  ].join("\n\n"));

дает нам:

с использованием среды браузера:
Mozilla / 5.0 (X11; U; Linux i686; en-US; rv: 1.9.2.3) Gecko / 20100423 Ubuntu / 10.04 (Ясный) Firefox / 3.6.3

function Array () {[собственный код]}

function Boolean () {[собственный код]}

function Date () {[собственный код]}

function Function () {[собственный код]}

номер функции () {[собственный код]}

function Object () {[собственный код]}

function RegExp() {[собственный код]}

function String () {[собственный код]}

function Error () {[собственный код]}

function Iterator (){[нативный код]}

Ответы [ 3 ]

4 голосов
/ 09 августа 2011

Первое:

Объекты являются функциями

Нет, не являются:

> a = function() {}
  function () {}
> a instanceof Object
  true
> b = {}
  Object
> b instanceof Function
  false

Метод toString (это то, что вызывается, когда вы делаете конкатенацию строк) не является надежным способом получения информации об объекте.Если я использую typeof, я получаю следующее:

using browser environment:  
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:5.0.1) Gecko/20100101 Firefox/5.0.1

function

function

function

object

function

function

function

Итак, вы видите, что большинство из них, кроме формы Storage, , на самом деле функционируют (почему это не работаетдля Storage, я не знаю).

Также имейте в виду, что интерфейс DOM может вести себя не так, как нативные объекты JavaScript.

С другой стороны, в Chrome метод toString дает это:

[object Function] 

[object Function] 

[object Function] 

function Storage() { [native code] } 

function XMLHttpRequest() { [native code] } 

function Worker() { [native code] } 

function FileReader() { [native code] }
1 голос
/ 11 августа 2011

Вопрос может быть перефразирован как:

"Применимы ли языковые соглашения JavaScript (ECMAScript) к другим компонентам браузера, таким как объекты программирования, которые взаимодействуют с DOM?"

В исходном вопросе используются объекты, которые предположительно имеют тип Function и используются в качестве конструкторов. В примерах показано, что существует дихотомия со средой программирования и интерфейсом DOM в том, как они представлены.

Если есть эта фактическая дихотомия, она сделана явной?

Это может быть актуальной проблемой. Если это так, первоначальному вопросу должен предшествовать этот вопрос, чтобы обратить внимание на реальную проблему.

ссылки:

ECMAScript язык constructor подробности:

1 голос
/ 09 августа 2011

Когда вы предупреждаете эти значения, механизм браузера выдает предупреждение value.toString(), поэтому мы говорим о том, почему Function.prototype.toString ведет себя странным образом.

В спецификации ES5.1 говорится:

15.3.4.2 Function.prototype.toString () Возвращается зависящее от реализации представление функции.Это представление имеет синтаксис FunctionDeclaration.

Обратите внимание, в частности, что использование и размещение пробелов, ограничителей строки и точек с запятой в представлении String зависит от реализации.

Функция toString не является универсальной;он генерирует исключение TypeError, если его значение this не является объектом Function.Поэтому его нельзя передать другим типам объектов для использования в качестве метода.

Ясно, что ES5 заявляет, что toString возвращает строку, специфичную для реализации.

Если вы читаете ES Harmony предлагает страницу, в которой говорится:

функция в строку - более подробная спецификация для проблемного Function.prototype.toString (markm, allen)

Вотнекоторые дополнительные ресурсы:

В основном это известная проблема toString на функциональных объектах (и особенно на хост-объектах, которые также являются функциями)является неопределенным поведением.Комитет TC39 уже работает над стандартизацией.

Как вы можете видеть, хост-объекты предлагается стандартизировать в strawman, так что в воздухе будет ли это превращаться в ES6.Однако функциональные объекты, живущие на земле ECMA, должны иметь стандартизированный метод toString в ES6, как определено на странице предложений гармонии.

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