У чому різниця між власними об’єктами та об’єктами хосту?


90

Чи стосується останніх просто непримітивних об’єктів функцій, створених за допомогою спеціального конструктора (наприклад, var bird1 = new Bird ();)?


2
Власні об'єкти визначені у специфікації ECMAScript, а об'єкти хосту - ні.
Šime Vidas

6
Наприклад, елемент DOM - скажімо, new Image()- це хост-об'єкт.

@ ŠimeVidas: Чи є причина, за якою ви залишили коментар, який суперечить вашій відповіді?
user113716

@ Ӫ _._ Ӫ Це зараз моя річ:)
Шіме Відас

1
@ ŠimeVidas: У вашому коментарі зазначено, що об'єкти хосту не визначені у специфікації ECMAScript . У вашій відповіді зазначено "Визначення для обох містяться в специфікації ECMAScript" .
user113716

Відповіді:


133

Обидва терміни визначені у специфікації 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 .., об'єкт хоста: window ...
Poelinca Dorin

1
а як щодо користувацького конструктора? наприклад, приклад птахів у моїй публікації
ppecher

2
@ ŠimeVidas: "Тоді це об'єкт-хост." Це не правильно. Див. Визначення, host objectописане у цій відповіді .
user113716

1
ŠimeVidas: Але в специфікації зазначено 'Значення внутрішньої властивості [[Клас]] хост-об'єкта може бути будь-яким значенням рядка, крім одного з "Аргументів", "Масиву", "Логічного", "Дата", "Помилка", "Функція", "JSON", "Математика", "Номер", "Об'єкт" , "RegExp" і "Рядок". ' Внутрішня властивість [[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, тоді як хост-об'єкти - ні.


Власні об'єкти відносяться до тих об'єктів, які створені за допомогою реалізації javascript (движка). Різниця між вбудованими та іншими власними об’єктами (об’єктами користувача) полягає в тому, що колишні об’єкти присутні з моменту запуску програми javascript, що відповідає відповідним правилам ECMA. Оскільки ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/… ), він не використовує наведену вище термінологію для класифікації об'єктів. Зверніться до моєї відповіді нижче.
jaaw

17

Ось моє розуміння специфікації.

Це:

var bird = new Bird();

... результатом є власний Об’єкт, який просто був створений за допомогою newоператора.

Власні об'єкти мають внутрішню властивість [[Class]] одного з таких:

"Аргументи", "Масив", "Логічне", "Дата", "Помилка", "Функція", "JSON", "Математика", "Номер", "Об'єкт", "RegExp" і "Рядок" .

Для вас bird1це буде:

"Об'єкт"

Так само, якби ви створили функцію:

function my_func() {
    // ...
}

... my_funcне визначено в ECMAScript, але це все ще власний об’єкт із внутрішнім [[Класом]]:

"Функція"

Об'єкт-хост - це об'єкт, що надається середовищем для того, щоб служити певній меті для цього середовища, не визначеного специфікацією.

Наприклад:

var divs = document.getElementsByTagName('div')

Об’єктом, на який посилається, divsє NodeList , який інтегрований у середовище таким чином, що він відчуває себе як звичайний об’єкт JavaScript, проте він ніде не визначений специфікацією.

Його внутрішня властивість [[Class]]:

"NodeList"

Це забезпечує розробникам реалізації певну гнучкість у пристосуванні реалізації до конкретних потреб середовища.

Існують вимоги до об'єктів-хостів , які визначені в специфікації.


2
+1, я погоджуюсь з вами, birdі Birdце рідні об’єкти , вони є визначеною користувачем функцією ( Bird) та об’єктом ( bird), створеним завдяки використанню функції як конструктора, вся семантика цього визначена в специфікації. Щодо хост-об’єктів, не варто надто покладатися на [[Class]]внутрішню властивість, наприклад, window.alertмає "Function"значення своєї [[Class]]властивості майже всі реалізації, на IE вона є "Object", і вона все ще є об’єктом-хостом ...
Крістіан Сальвадо

Дякую @CMS. Так, я не хотів робити надмірний наголос на використанні внутрішнього [[Class]]. Скоріше просто для того, щоб використати це як відчутний погляд на те, як реалізатори інтерпретували різні типи об’єктів. Отже , window.alertмає внутрішній [[Class]]з , "Function"здавалося б порушенням ES 5?
user113716

Я намагаюся побачити цю неприємну дію, але якщо я отримую тип цього div divs/NodeList, я отримую object. Я здогадуюсь, що я цього ще не розумію, але хіба це не зробить це рідним об’єктом?
Mark B

Це корисно . Отримати все, що windowвідображає, показує всі об'єкти, що приймають
Марк Б,

Bird не є природним об’єктом, оскільки його інтерфейс не повністю описаний у стандарті ECMASCript. Це справді так просто. Об'єкт є рідним, а рядок є рідним, але визначені користувачем або визначені хостом об'єкти не є рідними.
Скотт Маркус,

3

Не вдалося побачити переконливої ​​відповіді на питання, чи var bird1 = new Bird();є це рідний чи хост-об’єкт. Припускаючи , що птах є певним користувачем функцією, уродженець незабудованих в об'єкті буде створений в відповідно до http://es5.github.io/#x13.2 реалізацією JavaScript. На відміну від цього, власні вбудованийоб'єкти будуть присутні з моменту запуску програми javascript (такі як Object та багато інших). Різниця між власним об’єктом та об’єктом хосту полягає в тому, що перший створюється реалізацією javascript, а другий - забезпечується середовищем хоста. В результаті властивість внутрішнього [[класу]] об'єкта хоста може відрізнятися від властивостей, що використовуються вбудованими об'єктами (тобто "Аргументи", "Масив", "Логічне", "Дата", "Помилка", "Функція", " 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


3

На додаток до інших відповідей, що стосуються об'єктів хосту.

Об'єкти хоста специфічні для середовища. Отже, поряд із хост-об’єктами браузера, є також конкретні об’єкти для nodejs.

Для прикладу, спочатку починаючи зі стандартних об'єктів, як визначено в Javascript. Потім загальні об’єкти для браузера / DOM. Вузол має власні Об'єкти.

  1. Приклади стандартних вбудованих об’єктів Javascript :

  2. Приклади об’єктної моделі документа об’єктів хосту :

  3. Об'єкти хосту в Node.js :


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 == надається браузером або Node або…
  • більшість об'єктів хоста є рідними, і всі об'єкти, що не є хостом, також є рідними

Ви там трохи зійшли з рейок. "Більшість об'єктів хоста є рідними" невірно. Насправді, за визначенням ВСІ об'єкти хоста НЕ є рідними. Рідна мова означає "стандарт", звичайно, але це означає стандарт у специфікації мови, а не стандарт у сенсі незвичного. JavaScript (ECMASCript) визначає кілька інтерфейсів / API, які реалізуються браузерами та іншими хостами, такі як: String, Date, MATH, Boolean, Number, JSON та XmlHTTP. Ці об'єкти доступні, оскільки хост реалізує механізм, сумісний з ECMAScript, і відповідає стандарту ECMA.
Скотт Маркус,

0

Це може бути надмірним, але для простоти власний об’єкт - це той, який існує та може використовуватися в будь-якому середовищі, що реалізує механізм, сумісний із ECMAScript. Зазвичай це (але не завжди) браузер.

Отже, ваш Internet Explorer або ваш Google Chrome, наприклад, не роблять об’єктом String доступним для вас. Причиною того, що ви можете використовувати об’єкт String, є те, що він є “рідним” (вбудованим) для самої мови JavaScript.

Однак, якщо ви хочете створити спливаюче вікно, вам потрібно буде скористатися об’єктом window. Об'єкт вікна надається самим програмним забезпеченням браузера, тому він не є природним для JavaScript, але він є частиною "Моделі браузера" або специфікації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.