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

91

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

ппечер
источник
2
Собственные объекты определены в спецификации ECMAScript, а объекты хоста - нет.
Шиме Видас,
6
Например, элемент DOM new Image()- это хост-объект.
@ ŠimeVidas: Есть ли причина, по которой вы оставили комментарий, который противоречит вашему ответу?
user113716
@ Ӫ _._ Ӫ Теперь это мое дело:)
Шиме Видас
1
@ ŠimeVidas: В вашем комментарии говорится, что объекты хоста не определены в спецификации ECMAScript . Ваш ответ гласит: «Определения для обоих находятся в спецификации ECMAScript» .
user113716

Ответы:

135

Оба термина определены в спецификации 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, ...

Шиме Видас
источник
8
дайте ему еще несколько примеров, собственный объект: Array, String .., host object: window ...
Поэлинка Дорин
1
как насчет нестандартного custructor? например, пример птицы в моем посте
ppecher
2
@ ŠimeVidas: "Тогда это хост-объект". Это не так. См. Определение, host objectописанное в этом ответе .
user113716
1
ŠimeVidas: Но в спецификации указано : «Значение внутреннего свойства [[Class]] объекта хоста может быть любым строковым значением, кроме одного из« Arguments »,« Array »,« Boolean »,« Date »,« Error », «Функция», «JSON», «Математика», «Число», «Объект» , «Регулярное выражение» и «Строка». Внутреннее свойство [[Class]] вашего объекта Bird будет 'Object'или представлено Object.prototype.toStringкак '[object Object]'.
user113716
2
@ ŠimeVidas, я не согласен, если Birdэто функция, определяемая пользователем, ее семантика "полностью определена" спецификацией ES (как работают объекты функций, как они создаются, выполняются, используются с newоператором и т. Д. И т. Д. И т. Д.), Это родной объект ... Я мог бы опустить ответ ...
Кристиан С. Сальвадо
28

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

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

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

Пользовательские объекты : объекты, определенные в коде JavaScript. Итак, «Птица» в вашем примере будет пользовательским объектом.

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

JacquesB
источник
Собственные объекты относятся к тем объектам, которые создаются реализацией (движком) javascript. Разница между встроенными и другими собственными объектами (пользовательскими объектами) заключается в том, что прежние объекты присутствуют с момента запуска программы javascript, соответствующей соответствующим правилам ECMA. Начиная с ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/… ), он не использует вышеуказанную терминологию для классификации объектов. Обратитесь к моему ответу ниже.
jaaw
17

Вот мое понимание спецификации.

Этот:

var bird = new Bird();

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

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

«Аргументы», «Массив», «Логическое», «Дата», «Ошибка», «Функция», «JSON», «Математика», «Число», «Объект», «Регулярное выражение» и «Строка» .

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

«Объект»

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

function my_func() {
    // ...
}

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

«Функция»

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

Например:

var divs = document.getElementsByTagName('div')

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

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

"NodeList"

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

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

user113716
источник
2
+1, я согласен с вами, birdи они Birdявляются собственными объектами , они являются определяемой пользователем функцией ( Bird) и объектом ( bird), созданным с использованием функции в качестве конструктора, вся семантика этого определена в спецификации. Что [[Class]]касается хост-объектов, не слишком полагайтесь на внутреннее свойство, например, window.alertимеет "Function"в качестве значения своего [[Class]]свойства почти все реализации, в IE он есть "Object", и он все еще является хост-объектом ...
Кристиан С. Сальвадо,
Спасибо @CMS. Да, я не хотел уделять слишком много внимания использованию внутреннего [[Class]]. Скорее, чтобы использовать это как осязаемый взгляд на то, как разработчики интерпретировали различные типы объектов. Значит, window.alertналичие внутреннего [[Class]]состояния "Function"может показаться нарушением ES 5?
user113716 02
Я пытаюсь увидеть это действие, но если я получаю тип этого div divs/NodeList, я получаю object. Думаю, я этого еще не понимаю, но разве это не делает его нативным объектом?
Mark B
Это полезно . Получение всего windowпоказывает все основные объекты
Марк Б
Bird не является собственным объектом, поскольку его интерфейс не полностью описан в стандарте ECMASCript. Это действительно так просто. Object является собственным, а String - собственным, но объекты, определяемые пользователем или хостом, не являются собственными.
Скотт Маркус
4

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

Объекты хоста зависят от среды. Итак, рядом с объектами хоста браузеров в nodejs также есть определенные объекты.

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

  1. Примеры стандартных встроенных объектов Javascript :
  1. Примеры объектной модели документа Host Objects :
  1. Хост-объекты в Node.js :
Реми
источник
3

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

Также стоит отметить, что 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

челюсть
источник
1

Учитывая три объекта: Host, Native, Custom.

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

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

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

Хамасин
источник
0

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

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

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

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

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

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

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

Очередной раз:

  • родной == "стандартный"
  • host == предоставляется браузером, узлом или…
  • большинство объектов хоста являются собственными, и все объекты, не являющиеся хостами, тоже являются собственными
user123444555621
источник
Вы там немного сошли с рельсов. «Большинство хост-объектов являются собственными» неверно. Фактически, по определению ВСЕ объекты хоста НЕ являются собственными. «Родной», несомненно, означает «стандартный», но он означает стандарт в спецификации языка, а не стандарт в смысле необычного. JavaScript (ECMASCript) определяет несколько интерфейсов / API, которые реализуются браузерами и другими хостами, например: String, Date, MATH, Boolean, Number, JSON и XmlHTTP. Эти объекты доступны, потому что хост реализует совместимый с ECMAScript механизм и соответствует стандарту ECMA.
Скотт Маркус
0

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

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

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

Скотт Маркус
источник