Чи стосується останніх просто непримітивних об’єктів функцій, створених за допомогою спеціального конструктора (наприклад, var bird1 = new Bird ();)?
:)
Чи стосується останніх просто непримітивних об’єктів функцій, створених за допомогою спеціального конструктора (наприклад, var bird1 = new Bird ();)?
:)
Відповіді:
Обидва терміни визначені у специфікації 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, ...
host objectописане у цій відповіді .
'Object'або представлена Object.prototype.toStringяк '[object Object]'.
Birdфункція, яку визначає користувач, її семантика "повністю визначена" специфікацією ES (як функціонують об'єкти функції, як вони створюються, виконуються, використовуються з newоператором тощо, тощо, тощо) це рідний об'єкт ... Я можу відповісти ...
Це зрозуміліше, якщо ми розрізняємо три види об’єктів:
Вбудовані об'єкти : String, Math, RegExp, Object, і Functionт.д. - основні зумовлені об'єкти завжди доступні в JavaScript. Визначено в специфікації ECMAScript.
Приймаючі об’єкти : такі об’єкти, як window,XmlHttpRequest , DOM вузли і так далі, що забезпечується в середовищі браузера. Вони відрізняються від вбудованих об'єктів, оскільки не у всіх середовищах будуть однакові об'єкти хоста. Якщо JavaScript працює за межами браузера, наприклад як мова сценаріїв на стороні сервера, як у Node.js, будуть доступні різні об'єкти хосту.
Об'єкти користувача : об'єкти, визначені в коді JavaScript. Отже, "Птах" у вашому прикладі буде об'єктом користувача.
Специфікація JavaScript групує вбудовані об’єкти та об’єкти користувача разом як власні об’єкти . Це неортодоксальне використання терміна "рідна", оскільки користувацькі об'єкти, очевидно, реалізовані в JavaScript, тоді як вбудовані модулі, швидше за все, реалізовані іншою мовою, як і об'єкти хоста. Але з точки зору специфікації JavaScript, як вбудовані, так і користувацькі об'єкти є природними для JavaScript, оскільки вони визначені в специфікації JavaScript, тоді як хост-об'єкти - ні.
Ось моє розуміння специфікації.
Це:
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"
Це забезпечує розробникам реалізації певну гнучкість у пристосуванні реалізації до конкретних потреб середовища.
Існують вимоги до об'єктів-хостів , які визначені в специфікації.
birdі Birdце рідні об’єкти , вони є визначеною користувачем функцією ( Bird) та об’єктом ( bird), створеним завдяки використанню функції як конструктора, вся семантика цього визначена в специфікації. Щодо хост-об’єктів, не варто надто покладатися на [[Class]]внутрішню властивість, наприклад, window.alertмає "Function"значення своєї [[Class]]властивості майже всі реалізації, на IE вона є "Object", і вона все ще є об’єктом-хостом ...
[[Class]]. Скоріше просто для того, щоб використати це як відчутний погляд на те, як реалізатори інтерпретували різні типи об’єктів. Отже , window.alertмає внутрішній [[Class]]з , "Function"здавалося б порушенням ES 5?
divs/NodeList, я отримую object. Я здогадуюсь, що я цього ще не розумію, але хіба це не зробить це рідним об’єктом?
windowвідображає, показує всі об'єкти, що приймають
Не вдалося побачити переконливої відповіді на питання, чи 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
На додаток до інших відповідей, що стосуються об'єктів хосту.
Об'єкти хоста специфічні для середовища. Отже, поряд із хост-об’єктами браузера, є також конкретні об’єкти для nodejs.
Для прикладу, спочатку починаючи зі стандартних об'єктів, як визначено в Javascript. Потім загальні об’єкти для браузера / DOM. Вузол має власні Об'єкти.
Приклади стандартних вбудованих об’єктів Javascript :
Приклади об’єктної моделі документа об’єктів хосту :
Об'єкти хосту в Node.js :
Розглядаючи три об’єкти: Host, Native, Custom.
Об'єкти хоста створюються середовищем і є специфічними для середовища. Найвідомішим середовищем буде веб-браузер, але це може бути інша платформа. Об'єктами хоста, створеними у веб-браузері, може бути віконний об'єкт або документ. Зазвичай браузер використовує API для створення об'єктів хосту для відображення об'єктної моделі документа в JavaScript. (Веб-браузер має різні механізми JavaScript, які роблять це). Об’єкт хосту створюється автоматично в той момент, коли сторінка відображається у браузері.
Рідний об'єкт створюється розробником з використанням заздалегідь визначених класів JavaScript. Власні об’єкти містяться у вашому письмовому сценарії.
Потім власний об'єкт розробник створює із власного (не визначеного або частково визначеного) класу.
Рідні об'єкти - це об'єкти, які дотримуються специфікацій, тобто "стандартні об'єкти".
Об'єкти хоста - це об'єкти, які надає браузер (або інше середовище виконання, наприклад Node).
Більшість об'єктів хоста - це рідні об'єкти, і кожного разу, коли ви створюєте інстанцію, використовуючи щось new, ви можете бути впевнені на 99,99%, що це власний об'єкт, якщо ви не балуєтесь із дивними об'єктами хосту.
Це поняття було введено через наявність дуже дивних об'єктів в IE (та інших старих браузерах?) . Наприклад:
typeof document.all == "undefined"; // true
document.all.myElementId; // object
Побачивши це, всі згодні з тим , що document.allявно «нестандартним», і , таким чином, нерідний об'єкт хоста.
То чому б спочатку не назвати рідні об’єкти стандартними об’єктами ? Просто: врешті-решт, стандартний (!) Документ говорить і про неродні об’єкти, і називання їх нестандартними призведе до парадоксу.
Ще раз:
Це може бути надмірним, але для простоти власний об’єкт - це той, який існує та може використовуватися в будь-якому середовищі, що реалізує механізм, сумісний із ECMAScript. Зазвичай це (але не завжди) браузер.
Отже, ваш Internet Explorer або ваш Google Chrome, наприклад, не роблять об’єктом String доступним для вас. Причиною того, що ви можете використовувати об’єкт String, є те, що він є “рідним” (вбудованим) для самої мови JavaScript.
Однак, якщо ви хочете створити спливаюче вікно, вам потрібно буде скористатися об’єктом window. Об'єкт вікна надається самим програмним забезпеченням браузера, тому він не є природним для JavaScript, але він є частиною "Моделі браузера" або специфікації.