Относится ли последнее просто к объектам непримитивных функций, которые были созданы пользовательским конструктором (например, var bird1 = new Bird ();)?
javascript
ппечер
источник
источник
new Image()
- это хост-объект.:)
Ответы:
Оба термина определены в спецификации ECMAScript:
Источник: http://es5.github.com/#x4.3.6
Источник: 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]] одного из следующих:
Для вашего
bird1
это будет:Так же, как если бы вы создали функцию:
function my_func() { // ... }
...
my_func
не определен в ECMAScript, но это все еще собственный объект с внутренним [[Class]]:Хост-объект - это объект, предоставляемый средой для того, чтобы служить определенной цели для этой среды, не определенной в спецификации.
Например:
var divs = document.getElementsByTagName('div')
Объект, на который ссылается,
divs
- это NodeList , который интегрирован в среду таким образом, что выглядит как обычный объект JavaScript, но нигде в спецификации не определен.Его внутреннее свойство [[Class]]:
Это дает разработчикам реализации некоторую гибкость в адаптации реализации к конкретным потребностям среды.
Существуют требования к объектам хоста , которые определены во всей спецификации.
источник
bird
и ониBird
являются собственными объектами , они являются определяемой пользователем функцией (Bird
) и объектом (bird
), созданным с использованием функции в качестве конструктора, вся семантика этого определена в спецификации. Что[[Class]]
касается хост-объектов, не слишком полагайтесь на внутреннее свойство, например,window.alert
имеет"Function"
в качестве значения своего[[Class]]
свойства почти все реализации, в IE он есть"Object"
, и он все еще является хост-объектом ...[[Class]]
. Скорее, чтобы использовать это как осязаемый взгляд на то, как разработчики интерпретировали различные типы объектов. Значит,window.alert
наличие внутреннего[[Class]]
состояния"Function"
может показаться нарушением ES 5?divs/NodeList
, я получаюobject
. Думаю, я этого еще не понимаю, но разве это не делает его нативным объектом?window
показывает все основные объектыВ дополнение к другим ответам относительно Host Objects.
Объекты хоста зависят от среды. Итак, рядом с объектами хоста браузеров в nodejs также есть определенные объекты.
В качестве примера сначала начнем со стандартных объектов, определенных в Javascript. Затем общие объекты для браузера / DOM. У узла есть собственные объекты.
источник
Не удалось найти убедительного ответа на вопрос,
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. Вместо этого он определяет ниже типы объектов с более четкими объяснениями их предполагаемого поведения.
источник
Учитывая три объекта: 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.
Однако, если вы хотите создать всплывающее окно, вам необходимо использовать объект окна. Объект окна предоставляется самим программным обеспечением браузера, поэтому он не является родным для JavaScript, но является частью «объектной модели браузера» или спецификации.
источник