В чем разница между собственными объектами и объектами хоста?

Рассматриваются ли последние просто непримитивные объекты функции, созданные пользовательским конструктором (например, var bird1 = new Bird();)?

Ответ 1

Оба термина определены в спецификации ECMAScript:

собственный объект

в реализации ECMAScript, чья семантика полностью определенных этой спецификацией, а не средой хоста.

ПРИМЕЧАНИЕ. Стандартные исходные объекты определены в этой спецификации. Некоторые встроенные объекты; другие могут быть построены во время ход выполнения программы ECMAScript.

Источник: http://es5.github.com/#x4.3.6

объект хоста

предоставленный хост-средой для завершения среда выполнения ECMAScript.

ПРИМЕЧАНИЕ. Любой объект, который не является родным, является объектом-хостом.

Источник: http://es5.github.com/#x4.3.8


Несколько примеров:

Собственные объекты: Object (конструктор), Date, Math, parseInt, eval, строковые методы, такие как indexOf и replace, методы массивов,...

Объекты хоста (при условии среды браузера): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll,...

Ответ 2

Более ясно, будем ли мы различать три типа объектов:

Встроенные объекты: String, Math, RegExp, Object, Function и т.д. - основные предопределенные объекты, всегда доступные в JavaScript. Определено в спецификации ECMAScript.

Объекты хоста: объекты типа window, XmlHttpRequest, узлы DOM и т.д., которые предоставляются средой браузера. Они отличаются от встроенных объектов, потому что не все окружения будут иметь одни и те же объекты хоста. Если JavaScript работает за пределами браузера, например, на языке сценариев на стороне сервера, например, в Node.js, будут доступны разные объекты хоста.

Объекты пользователя: объекты, определенные в JavaScript-коде. Таким образом, "Птица" в вашем примере будет объектом пользователя.

Спецификация JavaScript содержит встроенные объекты и пользовательские объекты в качестве собственных объектов. Это неортодоксальное использование термина "родной", поскольку пользовательские объекты, очевидно, реализованы в JavaScript, а встроенные модули, скорее всего, реализованы на другом языке под капотом, точно так же, как и объекты хоста. Но с точки зрения спецификации JavaScript как встроенные, так и пользовательские объекты являются родными для JavaScript, поскольку они определены в спецификации JavaScript, в то время как объекты хоста не являются.

Ответ 3

Здесь мое понимание спецификации.

Это:

var bird = new Bird();

... приводит к созданию собственного объекта, который просто создается с помощью оператора new.

У родных объектов есть внутреннее свойство [[Class]] одного из следующих:

"Аргументы", "Массив", "Булевы", "Дата", "Ошибка", "Функция", "JSON", "Math", "Number", "Object", "RegExp" и "String".

Для вашего bird1 это будет:

"Объект"

Также, как если бы вы создали функцию:

function my_func() {
    // ...
}

... my_func не определен в ECMAScript, но он по-прежнему является родным объектом с внутренним [[Class]]:

"Функция"

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

Например:

var divs = document.getElementsByTagName('div')

Объектом, на который ссылается divs, является NodeList, который интегрирован в среду таким образом, что он похож на обычный объект JavaScript, но спецификацией он ничем не определен.

Свойство внутреннего [[Class]]:

"NodeList"

Это предоставляет разработчикам реализаций некоторую гибкость в соответствии с реализацией для конкретной потребности в среде.

Существуют требования к объектам хоста, которые определены во всей спецификации.

Ответ 4

Не удалось найти убедительный ответ на вопрос, является ли var bird1 = new Bird(); родным или хост-объектом. Предполагая, что Bird является пользовательской функцией, встроенный не встроенный объект будет создан в соответствии с http://es5.github.io/#x13.2 с помощью реализации javascript. Напротив, встроенные встроенные объекты будут присутствовать с момента запуска javascript-программы (например, Object и многих других). Разница между собственным объектом и объектом-хостом заключается в том, что предыдущий создается с помощью javascript-реализации, а последний предоставляется средой-хозяином. В результате внутреннее свойство [[class]] объекта объекта хоста может отличаться от свойств, используемых встроенными объектами (например, "Аргументы", "Массив", "Булевы", "Дата", "Ошибка", "Функция", JSON "," Math "," Number "," Object "," RegExp "и" String ").

Кроме того, стоит отметить, что ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf больше не использует терминологию native и host. Вместо этого он определяет ниже типы объектов, с более ясными объяснениями их предполагаемого поведения.

4.3.6 обычный объект

который имеет поведение по умолчанию для основных внутренних методов, которые должны поддерживаться всеми объектами

4.3.7 экзотический объект

который не имеет поведения по умолчанию для одного или нескольких основных внутренних методов, которые должны поддерживаться всеми объектами ЗАМЕТКА Любой объект, который не является обычным объектом, является экзотическим объектом.

4.3.8 стандартный объект

объект, семантика которого определена этой спецификацией

4.3.9 встроенный объект

указанный и предоставленный реализацией ECMAScript

Ответ 5

В дополнение к другим ответам относительно Host Objects.

Объекты хоста специфичны для среды. Итак, следующие объекты хоста браузера, есть также конкретные объекты для nodejs.

Для примера, сначала начиная с стандартных объектов, как определено в Javascript. Затем общие объекты для браузера /DOM. У узла есть собственные объекты.

  1. Стандартные примеры встроенных объектов Javascript:

  2. Примеры объектов объектной модели объекта хоста:

  3. Хост-объекты в Node.js:

Ответ 6

Рассмотрение трех объектов: Host, Native, Custom.

Хост-объекты создаются средой и являются средой. Самая известная среда - это веб-браузер, но может быть другой платформой. Объектами хоста, создаваемыми в веб-браузере, может быть объект окна или документ. Обычно браузер использует API для создания объектов хоста, чтобы отразить объектную модель документа в JavaScript. (У Webbrowser есть разные JavaScript-движки, которые это делают). Объект-хост создается автоматически в тот момент, когда страница отображается в браузере.

Собственный объект создается разработчиком с использованием предопределенных классов JavaScript. Родные объекты находятся в вашем письменном скрипте.

Затем пользовательский объект создается разработчиком из пользовательского (не предопределенного или частично предопределенного) класса.

Ответ 7

Собственные объекты - это объекты, которые соответствуют спецификациям, т.е. "стандартные объекты".

Объекты хоста - это объекты, которые предоставляет браузер (или другая среда выполнения, например Node).

Большинство объектов-хостов являются собственными объектами, и всякий раз, когда вы создаете что-то, используя new, вы можете быть уверены 99,99%, что он является родным объектом, если вы не обходитесь со странными объектами хоста.

Это понятие было введено из-за наличия очень странных объектов в IE (и других старых браузерах?). Например:

typeof document.all == "undefined"; // true
document.all.myElementId; // object

При этом все согласятся, что document.all явно "нестандартен" и, следовательно, не-собственный объект хоста.

Итак, почему бы не назвать обычные объекты стандартных объектов в первую очередь? Простой: в конце концов, Стандартный (!) Документ говорит и о нелокальных объектах, и называть их нестандартными приведет к парадоксу.

Опять же:

  • native == "standard"
  • host == предоставляется браузером или Node или...
  • большинство объектов хоста являются родными, а все объекты, отличные от хоста, тоже являются родными.

Ответ 8

Это может быть излишним, но для простоты собственный объект является тем, который существует и может использоваться в любой среде, которая реализует ECMAScript-совместимый движок. Обычно это (но не всегда) браузер.

Таким образом, ваш Internet Explorer или ваш Google Chrome, например, не делает объект String доступным для вас. Причина, по которой вы можете использовать объект String, заключается в том, что он является "родным" (встроенным) для самого языка JavaScript.

Однако, если вы хотите создать всплывающее окно, вам нужно будет использовать объект window. Объект окна предоставляется самим программным обеспечением браузера, поэтому он не является родным для JavaScript, но он является частью "Объектной модели браузера" или спецификации.