Вступление — Что ты должен знать?
Язык программирования JavaScript основан на стандарте ECMAScript. Именно по этому ты не можешь найти единой документации по JavaScript. Тебе всё время будут попадаться какие-то «сайтики» на подобии этого, где ты сейчас находишься. Моя задача пролить свет в твою ясную голову и рассказать, где искать ответы на свои вопросы.
Весь JavaScript работает на принципе объектов. Звучит непонятно. Давай разберём на примере. Вот, ты человек, так? То есть ты появился на свет не случайно. У тебя есть папа и мама. Вы все трое являетесь представителями вида «ЛЮДЕЙ». Что объединяет всех людей? У каждого есть 2 руки, 2 ноги, 2 уха, 2 глаза, 20 пальцев.
То есть любого человека можно описать на русском языке в виде Объекта:
- Вес: 70 кг
- Рост: 170 см
- Размер ноги: 43
- Количество рук: 2
- Количество ног: 2
- Умеет ходить: ДА
- Умеет бегать: ДА
- Умеет лежать: ДА
- Умеет есть еду: ДА
- Умеет спать: ДА
- …и т.д..
Таким образом, чтобы описать Объект «Человека» нам просто нужно знать его физические параметры (Значения) и физические возможности (Функции).
Теперь давайте переложим Объект «Человека» с русского языка на язык JavaScript:
{ Weight_kg: 70, Height_cm: 170, Foot_size: 43, Number_of_hands: 2, Number_of_legs: 2, Can_walk: true, Can_run: true, Can_lie_down: true, Can_eat_food: true, Knows_how_to_sleep: true }
Мы создали объект в JavaScript, который отражает сущность «человек». Будем звать его Вася. Этот объект мы поместили в переменную vasya:
Теперь мы всегда можем обратиться к этому объекту. Мы всегда можем получить информацию по Васе. Для этого достаточно написать название переменной в коде JavaScript-программы:
vasya
В результате мы получим JavaScript-объект с информацией:
Обратите внимание. Когда мы обратились к Васе мы увидели всю его информацию. Но что делать, если мы хотим получить только вес Васи? Как нам получить значение его килограмм? Для этого мы можем обратиться к Ключу «Weight_kg«, который вернёт нам число 70.
vasya.Weight_kg
Что мы сделали? Мы написали название объекта, затем мы поставили точку, после точки мы написали названия нужного поля (ключа) с весом. Так мы обратились к элементу объекта по его ключу и получили значение элемента.
Давайте оживим ситуацию и создадим новый Объект «Яблоко». Присвоим этому объекту имя yabloko.
var yabloko = { Weight_kg: 0.15 }
Внутри Объекта «Яблоко» будет всего один элемент, который обозначает вес яблока. Число 0.15 это в килограммах. А если в граммах, то это равно 150 грамм. Крупное яблоко.
Теперь давайте попробуем описать ситуацию, при которой наш Вася съел 6 таких яблок за вечер. Как нам это записать на JavaScript? Будем идти постепенно — по шагам. Для решения задачи нам нужно получить дополнительные данные. Сначала получим вес одного яблока:
yabloko.Weight_kg
Отлично! Теперь узнаем вес 6-ти яблок.
yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg
Мы сложили вес шести яблок в один и получили значение 0,9.
Супер! Теперь нам нужно добавить 0,9 «яблочных» к 70 «Васиных». Нам нужно увеличить значение Васиного веса на 0,9. Мы будем использовать оператор присваивания (=). Оператор выглядит как знак равенства.
Для этого воспользуемся такой языковой конструкцией:
vasya.Weight_kg = vasya.Weight_kg + (yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg)
То что справа от равенства мы присвоили тому что слева от равенства. То есть сначала сложились все веса, а потом итоговый вес присвоился Значению по Ключу Weight_kg объекта vasya.
В чём магия объектов? Теперь, если мы обратимся к объекту vasya, то мы увидим новые данные в том же самом поле. То есть мы всегда сможем узнавать вес Васи одной командой, но значение веса будет меняться когда угодно. Одно не зависит от другого. Всё хранится на своих местах — в элементах Объекта.
Тип данных Object (раздел 6.1.7)
Объект Object логически представляет собой набор свойств. Каждое свойство является либо «свойством данных» (data property), либо «свойством доступа» (accessor property):
- Свойство данных (data property) связывает значение ключа со значением языка ECMAScript и набором логических атрибутов Boolean.
- Свойство доступа (accessor property) связывает значение ключа с одной или двумя функциями средства доступа и набором логических атрибутов Boolean. Функции доступа используются для хранения или получения значения языка ECMAScript, связанного со свойством.
Свойства идентифицируются с помощью «значений ключей» (key values). «Значение ключа» (key value) свойства — это либо строковое значение ECMAScript (String), либо значение символа (Symbol). Все значения String и Symbol, включая пустую String, действительны как ключи свойств. «Имя свойства» (property name) — это ключ свойства, который является значением String.
Целочисленный индекс (integer index) — это ключ свойства со значением String, который является канонической числовой String (см. 7.1.21) и числовое значение которого равно +0𝔽 или положительное целое Number ≤ 𝔽 (253-1). Индекс массива (array index) — это целочисленный индекс, числовое значение i которого находится в диапазоне +0𝔽 ≤ i < 𝔽 (232-1).
Ключи свойств (Property keys) используются для доступа к свойствам и их значениям. Существует два вида доступа к свойствам: получение (get) и установка (set), соответствующие извлечению и присвоению значения соответственно. Свойства, доступные через доступ на получение и установку, включают как «собственные свойства» (own properties), которые являются непосредственной частью объекта, так и «унаследованные свойства» (inherited properties), которые предоставляются другим связанным объектом через отношения наследования свойств. Унаследованные свойства могут быть собственными или унаследованными свойствами связанного объекта. Каждое собственное свойство объекта должно иметь значение ключа (key value), отличное от значений ключей других собственных свойств этого объекта.
Все объекты логически являются наборами свойств, но существует несколько форм объектов, которые различаются своей семантикой для доступа к своим свойствам и управления ими. См. 6.1.7.2 для определения множественных форм объектов.
Атрибуты свойства (раздел 6.1.7.1)
Атрибуты (Attributes) используются в этой спецификации для определения и объяснения состояния свойств объекта Object. Свойство данных (data property) связывает значение ключа с атрибутами, перечисленными в таблице 3.
Имя атрибута | Область значений | Описание |
---|---|---|
[[Value]] | Любой тип из языка ECMAScript | Значение, полученное при доступе к свойству. |
[[Writable]] | Boolean | Если false, попытки кода ECMAScript изменить атрибут свойства [[Value]] с помощью [[Set]] не увенчаются успехом. |
[[Enumerable]] | Boolean | Если true, свойство будет нумероваться путем перечисления для входа (см. 13.7.5). В противном случае свойство называется неперечислимым (non-enumerable). |
[[Configurable]] | Boolean | Если false, попытки удалить свойство, изменить свойство на свойство доступа или изменить его атрибуты (кроме [[Value]] или изменение [[Writable]] на false) завершатся ошибкой. |
Таблица 3: Атрибуты свойства данных — Table 3: Attributes of a Data Property
Свойство средства доступа (accessor property) связывает значение ключа с атрибутами, перечисленными в таблице 4.
Имя атрибута | Область значений | Описание |
---|---|---|
[[Get]] | Object | Undefined | Если значение является объектом, это должен быть объект функции. Внутренний метод функции [[Call]] (Таблица 7) вызывается с пустым списком аргументов для получения значения свойства каждый раз, когда выполняется доступ к свойству. |
[[Set]] | Object | Undefined | Если значение является объектом, это должен быть объект функции. Внутренний метод функции [[Call]] (Таблица 7) вызывается со списком аргументов, содержащим назначенное значение в качестве единственного аргумента каждый раз, когда выполняется набор доступа к свойству. Эффект внутреннего метода свойства [[Set]] может, но не обязательно, влиять на значение, возвращаемое последующими вызовами внутреннего метода свойства [[Get]]. |
[[Enumerable]] | Boolean | Если true, свойство должно быть пронумеровано путем перечисления для входа (см. 13.7.5). В противном случае свойство называется неперечислимым. |
[[Configurable]] | Boolean | Если false, попытки удалить свойство, изменить свойство на свойство данных или изменить его атрибуты завершатся ошибкой. |
Таблица 4: Атрибуты свойства доступа — Table 4: Attributes of an Accessor Property
Если начальные значения атрибутов свойства явно не указаны в этой спецификации, используется значение по умолчанию, определенное в таблице 5.
Имя атрибута | Значение по умолчанию |
---|---|
[[Value]] | undefined |
[[Get]] | undefined |
[[Set]] | undefined |
[[Writable]] | false |
[[Enumerable]] | false |
[[Configurable]] | false |
Таблица 5: Значения атрибутов по умолчанию — Table 5: Default Attribute Values
Внутренние методы и внутренние слоты объекта Object (раздел 6.1.7.2)
Фактическая семантика объектов в ECMAScript определяется с помощью алгоритмов, называемых «внутренними методами» (internal methods). Каждый объект в механизме ECMAScript связан с набором внутренних методов, которые определяют его поведение во время выполнения. Эти внутренние методы не являются частью языка ECMAScript. Они определены данной спецификацией исключительно в ознакомительных целях. Однако каждый объект в реализации ECMAScript должен вести себя так, как указано внутренними методами, связанными с ним. Точный способ, которым это достигается, определяется реализацией.
Имена внутренних методов полиморфны. Это означает, что разные значения объектов могут выполнять разные алгоритмы, когда для них вызывается общее имя внутреннего метода. Фактический объект, для которого вызывается внутренний метод, является «целью» вызова. Если во время выполнения реализация алгоритма пытается использовать внутренний метод объекта, который этот объект не поддерживает, возникает исключение TypeError.
«Внутренние слоты» (internal slots) соответствуют внутреннему состоянию, которое связано с объектами и используется различными алгоритмами спецификации ECMAScript. Внутренние слоты не являются свойствами объекта и не наследуются. В зависимости от конкретной спецификации внутреннего слота такое состояние может состоять из значений любых языковых типов ECMAScript или определенных значений типа спецификации ECMAScript. Если явно не указано иное, внутренние слоты выделяются как часть процесса создания объекта и не могут быть динамически добавлены к объекту. Если не указано иное, начальным значением внутреннего слота является значение undefined. Различные алгоритмы в этой спецификации создают объекты, у которых есть внутренние слоты. Однако язык ECMAScript не предоставляет прямого способа связать внутренние слоты с объектом.
Внутренние методы и внутренние слоты идентифицируются в этой спецификации с использованием имен, заключенных в двойные квадратные скобки [[]].
В таблице 6 приведены «основные внутренние методы» (essential internal methods), используемые в этой спецификации, которые применимы ко всем объектам, созданным или управляемым кодом ECMAScript. У каждого объекта должны быть алгоритмы для всех основных внутренних методов. Однако не все объекты используют одни и те же алгоритмы для этих методов.
Обычный объект (ordinary object) — это объект, который удовлетворяет всем следующим критериям:
- Для внутренних методов, перечисленных в таблице 6, объект использует методы, определенные в 10.1.
- Если у объекта есть внутренний метод [[Call]], он использует метод, определенный в 10.2.1.
- Если у объекта есть внутренний метод [[Construct]], он использует метод, определенный в 10.2.2.
Экзотический объект (exotic object) — это объект, который не является обычным объектом.
Эта спецификация распознает различные виды экзотических объектов с помощью внутренних методов этих объектов. Объект, который поведенчески эквивалентен определенному типу экзотического объекта (например, экзотическому объекту Array или экзотическому объекту связанной функции), но не имеет той же коллекции внутренних методов, указанной для этого типа, не распознается как такой вид экзотический объект.
Столбец «Подпись» (Signature) в таблице 6 и других аналогичных таблицах описывает шаблон вызова для каждого внутреннего метода. Шаблон вызова всегда включает в себя заключенный в скобки список описательных имен параметров. Если имя параметра совпадает с именем типа ECMAScript, тогда имя описывает требуемый тип значения параметра. Если внутренний метод явно возвращает значение, за его списком параметров следует символ «→» и имя типа возвращаемого значения. Имена типов, используемые в «подписях» (сигнатурах), относятся к типам, определенным в разделе 6, дополненным следующими дополнительными именами. «Любой» (any) означает, что значением может быть любой тип языка ECMAScript.
В дополнение к своим параметрам внутренний метод всегда имеет доступ к объекту, который является целью вызова метода.
Внутренний метод неявно возвращает Запись о Завершении (Completion Record), либо обычное завершение, которое содержит значение типа возвращаемого значения, показанного в его шаблоне вызова, либо завершение выброса.
Внутренний метод (Internal Method) | Подпись (Signature) | Описание | |
---|---|---|---|
[[GetPrototypeOf]] | ( ) → Object | Null | Определите объект, который предоставляет унаследованные свойства для этого объекта. Значение null указывает на отсутствие унаследованных свойств. | |
[[SetPrototypeOf]] | (Object | Null) → Boolean | Свяжите этот объект с другим объектом, который предоставляет унаследованные свойства. Передача null указывает на отсутствие унаследованных свойств. Возвращает истину (true), указывающую, что операция была завершена успешно, или ложь (false), указывающую, что операция не была успешной. | |
[[IsExtensible]] | ( ) → Boolean | Определите, разрешено ли добавлять к этому объекту дополнительные свойства. | |
[[PreventExtensions]] | ( ) → Boolean | Укажите, можно ли добавлять к этому объекту новые свойства. Возвращает true, если операция прошла успешно, или false, если операция не удалась. | |
[[GetOwnProperty]] |
|
Вернуть «дескриптор свойства» (Property Descriptor) для собственного свойства этого объекта, ключ которого — propertyKey, или undefined, если такого свойства не существует. | |
[[DefineOwnProperty]] | (propertyKey, PropertyDescriptor) → Boolean | Создайте или измените собственное свойство, ключ которого — propertyKey, чтобы его состояние описывалось PropertyDescriptor. Верните true, если это свойство было успешно создано / обновлено, или false, если свойство не может быть создано или обновлено. | |
[[HasProperty]] | (propertyKey) → Boolean | Верните логическое значение, указывающее, есть ли у этого объекта собственное или унаследованное свойство, ключ которого — propertyKey. | |
[[Get]] | (propertyKey, Receiver) → any | Вернуть значение свойства, ключ которого — propertyKey из этого объекта. Если какой-либо код ECMAScript должен быть выполнен для получения значения свойства, Receiver используется как значение this при оценке кода. | |
[[Set]] | (propertyKey, value, Receiver) → Boolean | Задайте для свойства, ключ которого — propertyKey, значение value. Если какой-либо код ECMAScript должен быть выполнен для установки значения свойства, Receiver используется как значение this при оценке кода. Возвращает истину (true), если значение свойства было установлено, или ложь (false), если установить его не удалось. | |
[[Delete]] | (propertyKey) → Boolean | Удалите собственное свойство, ключ которого — propertyKey, из этого объекта. Верните false, если свойство не было удалено и все еще присутствует. Верните true, если свойство было удалено или отсутствует. | |
[[OwnPropertyKeys]] | ( ) → List of propertyKey | Вернуть Список, все элементы которого являются собственными ключами свойств объекта. |
Таблица 6: Основные внутренние методы — Table 6: Essential Internal Methods
В таблице 7 приведены дополнительные важные внутренние методы, которые поддерживаются объектами, которые могут вызываться как функции. Функциональный объект (function object) — это объект, который поддерживает внутренний метод [[Call]]. Конструктор (constructor) — это объект, который поддерживает внутренний метод [[Construct]]. Каждый объект, поддерживающий [[Construct]], должен поддерживать [[Call]]; то есть каждый конструктор должен быть функциональным объектом.
Следовательно, конструктор также может называться
Internal Method | Signature | Description |
---|---|---|
[[Call]] | (any, Список из any) → any | Выполняет код, связанный с этим объектом. Вызывается через выражение вызова функции. Аргументами внутреннего метода являются значение this и Список, элементы которого являются аргументами, переданными функции выражением вызова. Объекты, реализующие этот внутренний метод, являются вызываемыми (callable). |
[[Construct]] | (Список из any, Object) → Object | Создает объект. Вызывается через оператор new (новый) или вызов super (супер).
Первым аргументом внутреннего метода является Список, элементы которого являются аргументами вызова конструктора или вызова super. Второй аргумент — это объект, к которому изначально был применен оператор new. Объекты, реализующие этот внутренний метод, называются конструкторами (constructors). Функциональный объект не обязательно является конструктором, и такие функциональные объекты, не являющиеся конструктором, не имеют внутреннего метода [[Construct]]. |
Таблица 7: Дополнительные важные внутренние методы функциональных объектов — Table 7: Additional Essential Internal Methods of Function Objects
Семантика основных внутренних методов для обычных объектов и стандартных экзотических объектов указана в разделе 10. Если какое-либо указанное использование внутреннего метода экзотического объекта не поддерживается реализацией, это использование должно вызывать исключение TypeError при попытке.
Инварианты основных внутренних методов
Внутренние методы объектов механизма ECMAScript должны соответствовать списку инвариантов, указанному ниже. Обычные объекты ECMAScript, а также все стандартные экзотические объекты в этой спецификации поддерживают эти инварианты. Объекты ECMAScript Proxy поддерживают эти инварианты посредством проверок во время выполнения результатов ловушек, вызванных для объекта [[ProxyHandler]].
Любая реализация, предоставляющая экзотические объекты, также должна поддерживать эти инварианты для этих объектов. Нарушение этих инвариантов может привести к непредсказуемому поведению кода ECMAScript и возникновению проблем с безопасностью. Однако нарушение этих инвариантов никогда не должно ставить под угрозу безопасность памяти реализации.
Реализация не должна позволять обходить эти инварианты каким-либо образом, например, путем предоставления альтернативных интерфейсов, которые реализуют функциональность основных внутренних методов, не применяя их инварианты.
Определения:
- Целью target внутреннего метода является объект, для которого вызывается внутренний метод.
- Цель не является расширяемой non-extensible, если было замечено, что она возвращает false из внутреннего метода [[IsExtensible]] или true из внутреннего метода [[PreventExtensions]].
- Несуществующее свойство non-existent — это свойство, которое не существует как собственное свойство на нерасширяемой цели.
- Все ссылки на SameValue соответствуют определению алгоритма SameValue.
Возвращаемое значение:
Значение, возвращаемое любым внутренним методом, должно быть записью завершения с одним из следующих вариантов:
- [[Type]] = normal, [[Target]] = empty, и [[Value]] = значение «нормального возвращаемого типа», показанное ниже для этого внутреннего метода, или
- [[Type]] = throw, [[Target]] = empty, и [[Value]] = любое значение языка ECMAScript.
Внутренний метод не должен возвращать завершение с [[Type]] = continue, break или return.
[[GetPrototypeOf]] ( )
[[SetPrototypeOf]] ( V )
[[IsExtensible]] ( )
[[PreventExtensions]] ( )
[[GetOwnProperty]] ( P )
[[DefineOwnProperty]] ( P, Desc )
[[HasProperty]] ( P )
[[Get]] ( P, Receiver )
[[Set]] ( P, V, Receiver )
[[Delete]] ( P )
[[OwnPropertyKeys]] ( )
[[Call]] ( )
[[Construct]] ( )
[[GetPrototypeOf]] ( )
- Обычный тип возвращаемого значения — Object или Null.
- Если цель не является расширяемой и [[GetPrototypeOf]] возвращает значение V, то любые будущие вызовы [[GetPrototypeOf]] должны возвращать SameValue как V.
Цепочка прототипов объекта должна иметь конечную длину (то есть, начиная с любого объекта, рекурсивное применение внутреннего метода [[GetPrototypeOf]] к его результату должно в конечном итоге привести к значению null). Однако это требование не может быть исполнено как инвариант уровня объекта, если цепочка прототипов включает любые экзотические объекты, которые не используют определение обычного объекта [[GetPrototypeOf]]. Такая круговая цепочка прототипов может привести к бесконечным циклам при доступе к свойствам объекта.
[[SetPrototypeOf]] ( V )
- Обычный тип возвращаемого значения — логический (Boolean).
- Если цель не расширяема, [[SetPrototypeOf]] должен возвращать false, если только V не является SameValue в качестве наблюдаемого [[GetPrototypeOf]] значения цели.
[[IsExtensible]] ( )
- Обычный тип возвращаемого значения — логический (Boolean)
- Если [[IsExtensible]] возвращает false, все будущие вызовы [[IsExtensible]] на целевом объекте должны возвращать false.
[[PreventExtensions]] ( )
- Обычный тип возвращаемого значения — логический (Boolean).
- Если [[PreventExtensions]] возвращает true, все будущие вызовы [[IsExtensible]] на цели должны возвращать false, и цель теперь считается нерасширяемой.
[[GetOwnProperty]] ( P )
- Обычный тип возвращаемого значения — либо Дескриптор Свойства (Property Descriptor), либо Неопределенный (Undefined).
- Если Тип возвращаемого значения — Дескриптор Свойства, возвращаемое значение должно быть полностью заполненным дескриптором свойства.
- Если P описывается как ненастраиваемое(non-configurable), без возможности записи (non-writable) собственных данных свойства, все будущие вызовы [[GetOwnProperty]] (P) должны возвращать дескриптор свойства, у которого [[Value]] такое же значение, как у атрибута P [[Value]].
- Если атрибуты P, отличные от [[Writable]], могут изменяться со временем или если свойство может быть удалено, тогда атрибут P [[Configurable]] должен быть истинным true.
- Если атрибут [[Writable]] может измениться с false на true, тогда атрибут [[Configurable]] должен иметь значение true.
- Если цель не является расширяемой и P не существует, тогда все будущие вызовы [[GetOwnProperty]] (P) на цели должны описывать P как несуществующий (то есть [[GetOwnProperty]] (P) должен возвращать undefined ).
Как следствие третьего инварианта, если свойство описывается как свойство данных и может возвращать разные значения с течением времени, тогда один или оба атрибута [[Writable]] и [[Configurable]] должны быть истинными, даже если нет механизма изменения значения предоставляется через другие важные внутренние методы.
[[DefineOwnProperty]] ( P, Desc )
Обычный тип возвращаемого значения — логический (Boolean).
[[DefineOwnProperty]] должен возвращать false, если P ранее наблюдалось как не настраиваемое собственное свойство цели, кроме случаев:
- P — это свойство данных с возможностью записи. Ненастраиваемое свойство данных с возможностью записи может быть изменено на ненастраиваемое свойство данных с возможностью записи.
- Все атрибуты Desc имеют то же значение, что и атрибуты P.
[[DefineOwnProperty]] (P, Desc) должно возвращать false, если цель не является расширяемой, а P — несуществующее собственное свойство. То есть нерасширяемый целевой объект не может быть расширен новыми свойствами.
[[HasProperty]] ( P )
- Обычный тип возвращаемого значения — логический (Boolean).
- Если P ранее наблюдалось как ненастраиваемые собственные данные или свойство доступа цели, [[HasProperty]] должен возвращать истину true.
[[Get]] ( P, Receiver )
- Нормальный тип возвращаемого значения — любой тип языка ECMAScript.
- Если P ранее наблюдался как ненастраиваемое, не записываемое собственных свойство данных цели со значением V, то [[Get]] должен возвращать SameValue как V.
- Если P ранее наблюдался как ненастраиваемое собственное свойство доступа цели, атрибут [[Get]] которого не определен undefined, операция [[Get]] должна возвращать undefined.
[[Set]] ( P, V, Receiver )
- Обычный тип возвращаемого значения — логический (Boolean).
- Если P ранее наблюдалось как ненастраиваемое собственное свойство данных без возможности записи для целевого объекта, то [[Set]] должен возвращать false, если V не является SameValue, что и атрибут P [[Value]].
- Если P ранее наблюдался как ненастраиваемое собственное свойство доступа цели, атрибут [[Set]] которого не определен, операция [[Set]] должна возвращать false.
[[Delete]] ( P )
- Обычный тип возвращаемого значения — логический (Boolean).
- Если P ранее наблюдалось как ненастраиваемые собственные данные или свойство доступа цели, [[Delete]] должно возвращать false.
[[OwnPropertyKeys]] ( )
- Обычный тип возвращаемого значения — Список.
- Возвращенный Список не должен содержать повторяющихся записей.
- Тип каждого элемента возвращаемого Список — либо String, либо Symbol.
- Возвращенный список должен содержать по крайней мере ключи всех не настраиваемых собственных свойств, которые ранее наблюдались.
- Если цель не является расширяемой, возвращаемый Список должен содержать только ключи всех собственных свойств цели, которые можно наблюдать с помощью [[GetOwnProperty]].
[[Call]] ( )
- Нормальный тип возвращаемого значения — любой тип языка ECMAScript.
[[Construct]] ( )
- Обычный тип возвращаемого значения — Object.
- У цели также должен быть внутренний метод [[Call]].
Хорошо известные внутренние объекты (раздел 6.1.7.4)
Хорошо известные внутренние сущности — это встроенные объекты, на которые явно ссылаются алгоритмы данной спецификации и которые обычно имеют индивидуальности, специфичные для области. Если не указано иное, каждый внутренний объект фактически соответствует набору подобных объектов, по одному на область.
В этой спецификации ссылка, такая как %name%, означает внутренний объект, связанный с текущей областью, соответствующий имени. Ссылка, такая как %name.a.b%, означает, как если бы к свойству «b» свойства «a» внутреннего объекта %name% был осуществлен доступ до оценки любого кода ECMAScript. Определение текущей области и ее внутренних свойств описано в 9.3. Хорошо известные внутренние функции перечислены в таблице 8.
Intrinsic Name (Имя внутренней сущности) | Global Name (Глобальное имя) | ECMAScript Language Association (Ассоциация языков ECMAScript) |
---|---|---|
%AggregateError% | AggregateError |
The AggregateError constructor (20.5.7.1) |
%Array% | Array |
The Array constructor (23.1.1) |
%ArrayBuffer% | ArrayBuffer |
The ArrayBuffer constructor (25.1.3) |
%ArrayIteratorPrototype% | The prototype of Array iterator objects (23.1.5) | |
%AsyncFromSyncIteratorPrototype% | The prototype of async-from-sync iterator objects (27.1.4) | |
%AsyncFunction% | The constructor of async function objects (27.7.1) | |
%AsyncGeneratorFunction% | The constructor of async iterator objects (27.4.1) | |
%AsyncIteratorPrototype% | An object that all standard built-in async iterator objects indirectly inherit from | |
%Atomics% | Atomics |
The Atomics object (25.4) |
%BigInt% | BigInt |
The BigInt constructor (21.2.1) |
%BigInt64Array% | BigInt64Array |
The BigInt64Array constructor (23.2) |
%BigUint64Array% | BigUint64Array |
The BigUint64Array constructor (23.2) |
%Boolean% | Boolean |
The Boolean constructor (20.3.1) |
%DataView% | DataView |
The DataView constructor (25.3.2) |
%Date% | Date |
The Date constructor (21.4.2) |
%decodeURI% | decodeURI |
The decodeURI function (19.2.6.2) |
%decodeURIComponent% | decodeURIComponent |
The decodeURIComponent function (19.2.6.3) |
%encodeURI% | encodeURI |
The encodeURI function (19.2.6.4) |
%encodeURIComponent% | encodeURIComponent |
The encodeURIComponent function (19.2.6.5) |
%Error% | Error |
The Error constructor (20.5.1) |
%eval% | eval |
The eval function (19.2.1) |
%EvalError% | EvalError |
The EvalError constructor (20.5.5.1) |
%FinalizationRegistry% | FinalizationRegistry |
The FinalizationRegistry constructor (26.2.1) |
%Float32Array% | Float32Array |
The Float32Array constructor (23.2) |
%Float64Array% | Float64Array |
The Float64Array constructor (23.2) |
%ForInIteratorPrototype% | The prototype of For-In iterator objects (14.7.5.10) | |
%Function% | Function |
The Function constructor (20.2.1) |
%GeneratorFunction% | The constructor of generator objects (27.3.1) | |
%Int8Array% | Int8Array |
The Int8Array constructor (23.2) |
%Int16Array% | Int16Array |
The Int16Array constructor (23.2) |
%Int32Array% | Int32Array |
The Int32Array constructor (23.2) |
%isFinite% | isFinite |
The isFinite function (19.2.2) |
%isNaN% | isNaN |
The isNaN function (19.2.3) |
%IteratorPrototype% | An object that all standard built-in iterator objects indirectly inherit from | |
%JSON% | JSON |
The JSON object (25.5) |
%Map% | Map |
The Map constructor (24.1.1) |
%MapIteratorPrototype% | The prototype of Map iterator objects (24.1.5) | |
%Math% | Math |
The Math object (21.3) |
%Number% | Number |
The Number constructor (21.1.1) |
%Object% | Object |
The Object constructor (20.1.1) |
%parseFloat% | parseFloat |
The parseFloat function (19.2.4) |
%parseInt% | parseInt |
The parseInt function (19.2.5) |
%Promise% | Promise |
The Promise constructor (27.2.3) |
%Proxy% | Proxy |
The Proxy constructor (28.2.1) |
%RangeError% | RangeError |
The RangeError constructor (20.5.5.2) |
%ReferenceError% | ReferenceError |
The ReferenceError constructor (20.5.5.3) |
%Reflect% | Reflect |
The Reflect object (28.1) |
%RegExp% | RegExp |
The RegExp constructor (22.2.3) |
%RegExpStringIteratorPrototype% | The prototype of RegExp String Iterator objects (22.2.7) | |
%Set% | Set |
The Set constructor (24.2.1) |
%SetIteratorPrototype% | The prototype of Set iterator objects (24.2.5) | |
%SharedArrayBuffer% | SharedArrayBuffer |
The SharedArrayBuffer constructor (25.2.2) |
%String% | String |
The String constructor (22.1.1) |
%StringIteratorPrototype% | The prototype of String iterator objects (22.1.5) | |
%Symbol% | Symbol |
The Symbol constructor (20.4.1) |
%SyntaxError% | SyntaxError |
The SyntaxError constructor (20.5.5.4) |
%ThrowTypeError% | A function object that unconditionally throws a new instance of %TypeError% | |
%TypedArray% | The super class of all typed Array constructors (23.2.1) | |
%TypeError% | TypeError |
The TypeError constructor (20.5.5.5) |
%Uint8Array% | Uint8Array |
The Uint8Array constructor (23.2) |
%Uint8ClampedArray% | Uint8ClampedArray |
The Uint8ClampedArray constructor (23.2) |
%Uint16Array% | Uint16Array |
The Uint16Array constructor (23.2) |
%Uint32Array% | Uint32Array |
The Uint32Array constructor (23.2) |
%URIError% | URIError |
The URIError constructor (20.5.5.6) |
%WeakMap% | WeakMap |
The WeakMap constructor (24.3.1) |
%WeakRef% | WeakRef |
The WeakRef constructor (26.1.1) |
%WeakSet% | WeakSet |
The WeakSet constructor (24.4.1) |
Таблица 8: Хорошо известные внутренние объекты — Table 8: Well-Known Intrinsic Objects
Дополнительные записи в таблице 82.
Intrinsic Name | Global Name | ECMAScript Language Association |
---|---|---|
%escape% | escape |
The escape function (B.2.1.1) |
%unescape% | unescape |
The unescape function (B.2.1.2) |
Таблица 82: Дополнительные хорошо известные внутренние объекты — Table 82: Additional Well-known Intrinsic Objects
Конструктор Object
Конструктор Object:
- является %Object%.
- это начальное значение свойства «Object» глобального объекта.
- создает новый обычный объект при вызове в качестве конструктора.
- выполняет преобразование типа при вызове как функции, а не как конструктор.
- предназначен для создания подклассов. Он может использоваться как значение предложения extends определения класса.
Object ( [ value ] )
Когда функция Object вызывается с необязательным аргументом value, выполняются следующие шаги:
1. Если NewTarget не является ни undefined (неопределенной), ни активной функцией, тогда a. Вернуть ? OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%"). 2. Если value является undefined или null, вернуть ! OrdinaryObjectCreate(%Object.prototype%). 3. Вернуть ! ToObject(value).
Свойство «length» функции Object равно 1𝔽.
Свойства конструктора Object
Конструктор Object:
- имеет внутренний слот [[Prototype]], значение которого — %Function.prototype%.
- имеет свойство «length».
- имеет следующие дополнительные свойства:
- assign
- create
- defineProperties
- defineProperty
- entries
- freeze
- fromEntries
- getOwnPropertyDescriptor
- getOwnPropertyDescriptors
- getOwnPropertyNames
- getOwnPropertySymbols
- getPrototypeOf
- is
- isExtensible
- isFrozen
- isSealed
- keys
- preventExtensions
- prototype
- seal
- setPrototypeOf
- values
Object.assign ( target, …sources )
Функция assign используется для копирования значений всех перечисляемых собственных свойств из одного или нескольких исходных объектов в целевой объект target. Когда вызывается функция assign, выполняются следующие шаги:
1. Пусть to будет ? ToObject(target). 2. Если был передан только один аргумент, верните to. 3. Для каждого элемента nextSource из sources выполните a. Если nextSource не является ни undefined, ни null, то i. Пусть from будет ! ToObject(nextSource). ii. Пусть keys будет ? from.[[OwnPropertyKeys]](). iii. Для каждого элемента nextKey из keys выполните 1. Пусть desc будет ? from.[[GetOwnProperty]](nextKey). 2. Если desc не является undefined и desc.[[Enumerable]] истинно true, то a. Пусть propValue будет ? Get(from, nextKey). b. Выполнить ? Set(to, nextKey, propValue, true). 4. Вернуть to
Свойство «length» функции assign равно 2𝔽.
Object.create ( O, Properties )
Функция create создает новый объект с указанным прототипом. Когда вызывается функция create, выполняются следующие шаги:
1. Если Type(O) не является ни Object, ни Null, выбросить исключение TypeError. 2. Пусть obj будет ! OrdinaryObjectCreate(O). 3. Если Properties не является undefined, тогда a. Вернуть ? ObjectDefineProperties(obj, Properties). 4. Вернуть obj
Object.defineProperties ( O, Properties )
Функция defineProperties используется для добавления собственных свойств и/или обновления атрибутов существующих собственных свойств объекта. Когда вызывается функция defineProperties, выполняются следующие шаги:
1. Если Type(O) не является Object, вызовите исключение TypeError. 2. Вернуть ? ObjectDefineProperties(O, Properties).
ObjectDefineProperties ( O, Properties )
Абстрактная операция ObjectDefineProperties принимает аргументы O и Properties. При вызове онf выполняет следующие шаги:
1. Утверждение: Type(O) - это Объект (Object). 2. Пусть props будет ? ToObject(Properties). 3. Пусть keys будет ? props.[[OwnPropertyKeys]](). 4. Пусть descriptors будет новым пустым списком List. 5. Для каждого элемента nextKey из keys выполните a. Пусть propDesc будет ? props.[[GetOwnProperty]](nextKey). b. Если propDesc не является undefined и propDesc.[[Enumerable]] является true, тогда i. Пусть descObj будет ? Get(props, nextKey). ii. Пусть desc будет ? ToPropertyDescriptor(descObj). iii. Добавьте пару (двухэлементный список List), состоящую из nextKey и desc, в конец descriptors. 6. Для (каждой пары дескрипторов) каждого элемента pair из descriptors выполните a. Пусть P - первый элемент пары pair. b. Пусть desc будет вторым элементом пары pair. c. Выполнить ? DefinePropertyOrThrow(O, P, desc). 7. Вернуть O
Object.defineProperty ( O, P, Attributes )
Функция defineProperty используется для добавления собственного свойства и/или обновления атрибутов существующего собственного свойства объекта. Когда вызывается функция defineProperty, выполняются следующие шаги:
1. Если Type(O) не является объектом Object, вызовите исключение TypeError. 2. Пусть key будет ? ToPropertyKey(P). 3. Пусть desc будет ? ToPropertyDescriptor(Attributes). 4. Выполнить ? DefinePropertyOrThrow(O, key, desc). 5. Вернуть O
Object.entries ( O )
Когда функция entries (записи) вызывается с аргументом O, выполняются следующие шаги:
1. Пусть obj будет ? ToObject(O). 2. Пусть nameList будет ? EnumerableOwnPropertyNames(obj, key+value). 3. Вернуть CreateArrayFromList(nameList).
Object.freeze ( O )
Когда вызывается функция замораживания freeze, выполняются следующие шаги:
1. Если Type(O) не является Объектом (Object), верните O. 2. Пусть status будет ? SetIntegrityLevel(O, frozen). 3. Если status равен false, выбросить исключение TypeError. 4. Вернуть O
Object.fromEntries ( iterable )
Когда метод fromEntries вызывается с аргументом iterable, выполняются следующие шаги:
1. Выполнить? RequireObjectCoercible(iterable). 2. Пусть obj будет ! OrdinaryObjectCreate(%Object.prototype%). 3. Утверждение: obj - это расширяемый обычный объект без собственных свойств. 4. Пусть stepsDefine будет шагами алгоритма, определенными в функциях CreateDataPropertyOnObject. 5. Пусть adder будет ! CreateBuiltinFunction(stepsDefine, « »). 6. Вернуть ? AddEntriesFromIterable(obj, iterable, adder).
Функция, созданная для сумматора adder, никогда не доступна напрямую коду ECMAScript.
CreateDataPropertyOnObject Functions
Функция CreateDataPropertyOnObject — это встроенная анонимная функция. Когда функция CreateDataPropertyOnObject вызывается с аргументами key и value, выполняются следующие шаги:
1. Пусть O будет значением этого this. 2. Утверждение: Type(O) является Object. 3. Утверждение: O - расширяемый обычный объект. 4. Пусть propertyKey будет ? ToPropertyKey(key). 5. Выполнить ! CreateDataPropertyOrThrow(O, propertyKey, value). 6. Вернуть undefined
Object.getOwnPropertyDescriptor ( O, P )
Когда вызывается функция getOwnPropertyDescriptor, выполняются следующие шаги:
1. Пусть obj будет ? ToObject(O). 2. Пусть key будет ? ToPropertyKey(P). 3. Пусть desc будет ? obj.[[GetOwnProperty]](key). 4. Вернуть FromPropertyDescriptor(desc).
Object.getOwnPropertyDescriptors ( O )
Когда вызывается функция getOwnPropertyDescriptors, выполняются следующие шаги:
1. Пусть obj будет ? ToObject(O). 2. Пусть ownKeys будет ? obj.[[OwnPropertyKeys]](). 3. Пусть descriptors будет ! OrdinaryObjectCreate(%Object.prototype%). 4. Для каждого элемента key из ownKeys выполните a. Пусть desc будет ? obj.[[GetOwnProperty]](key). b. Пусть descriptor будет ! FromPropertyDescriptor(desc). c. Если descriptor не является undefined, выполнить ! CreateDataPropertyOrThrow(descriptors, key, descriptor). 5. Вернуть descriptors
Object.getOwnPropertyNames ( O )
Когда вызывается функция getOwnPropertyNames, выполняются следующие шаги:
1. Вернуть ? GetOwnPropertyKeys(O, string).
Object.getOwnPropertySymbols ( O )
Когда функция getOwnPropertySymbols вызывается с аргументом O, выполняются следующие шаги:
1. Вернуть ? GetOwnPropertyKeys(O, symbol).
GetOwnPropertyKeys ( O, type )
Абстрактная операция GetOwnPropertyKeys принимает аргументы O и type (строка string или символ symbol). При вызове она выполняет следующие шаги:
1. Пусть obj будет ? ToObject(O). 2. Пусть keys будет ? obj.[[OwnPropertyKeys]](). 3. Пусть nameList будет новым пустым списком List. 4. Для каждого элемента nextKey из keys выполните a. Если Type(nextKey) - Symbol, а type - symbol или Type(nextKey) - String, а type - string, то i. Добавьте nextKey в качестве последнего элемента nameList. 5. Вернуть CreateArrayFromList(nameList).
Object.getPrototypeOf ( O )
Когда функция getPrototypeOf вызывается с аргументом O, выполняются следующие шаги:
1. Пусть obj будет ? ToObject(O). 2. Вернуть ? obj.[[GetPrototypeOf]]().
Object.is ( value1, value2 )
Когда функция is вызывается с аргументами value1 и value2, выполняются следующие шаги:
1. Вернуть SameValue(value1, value2).
Object.isExtensible ( O )
Когда функция isExtensible вызывается с аргументом O, выполняются следующие шаги:
1. Если Type(O) не является Object, вернуть false. 2. Вернуть ? IsExtensible(O).
Object.isFrozen ( O )
Когда функция isFrozen вызывается с аргументом O, выполняются следующие шаги:
1. Если Type(O) не является Object, вернуть true. 2. Вернуть ? TestIntegrityLevel(O, frozen).
Object.isSealed ( O )
Когда функция isSealed вызывается с аргументом O, выполняются следующие шаги:
1. Если Type(O) не является Object, вернуть true. 2. Вернуть ? TestIntegrityLevel(O, sealed).
Object.keys ( O )
Когда функция keys вызывается с аргументом O, выполняются следующие шаги:
1. Пусть obj будет ? ToObject(O). 2. Пусть nameList будет ? EnumerableOwnPropertyNames(obj, key). 3. Вернуть CreateArrayFromList(nameList).
Object.preventExtensions ( O )
Когда вызывается функция preventExtensions, выполняются следующие шаги:
1. Если Type(O) не является Object, вернуть O. 2. Пусть status будет ? O.[[PreventExtensions]](). 3. Если status является false, выбросить исключение TypeError. 4. Вернуть O.
Object.prototype
Начальным значением Object.prototype является объект-прототип Object.
Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.
Object.seal ( O )
Когда вызывается функция уплотнения seal, выполняются следующие шаги:
1. Если Type(O) не является Object, вернуть O. 2. Пусть status будет ? SetIntegrityLevel(O, sealed). 3. Если status является false, выбросить исключение TypeError. 4. Вернуть O.
Object.setPrototypeOf ( O, proto )
Когда функция setPrototypeOf вызывается с аргументами O и proto, выполняются следующие шаги:
1. Установить O на ? RequireObjectCoercible(O). 2. Если Type(proto) не является ни Object, ни Null, выбросить исключение TypeError. 3. Если Type(O) не является Object, вернуть O. 4. Пусть status будет ? O.[[SetPrototypeOf]](proto). 5. Если status является false, выбросить исключение TypeError. 6. Вернуть O.
Object.values ( O )
Когда функция значений values вызывается с аргументом O, выполняются следующие шаги:
1. Пусть obj будет ? ToObject(O). 2. Пусть nameList будет ? EnumerableOwnPropertyNames(obj, value). 3. Вернуть CreateArrayFromList(nameList).
Свойства прототипа объекта Object
Объект-прототип Object:
- является %Object.prototype%.
- имеет внутренний слот [[Extensible]], значение которого истинно true.
- имеет внутренние методы, определенные для обычных объектов, за исключением метода [[SetPrototypeOf]], который определен в 9.4.7.1. (Таким образом, это неизменный прототип экзотического объекта.)
- имеет внутренний слот [[Prototype]], значение которого равно null.
- Object.prototype.constructor
- Object.prototype.hasOwnProperty ( V )
- Object.prototype.isPrototypeOf ( V )
- Object.prototype.propertyIsEnumerable ( V )
- Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
- Object.prototype.toString ( )
- Object.prototype.valueOf ( )
Object.prototype.constructor
Начальное значение Object.prototype.constructor — %Object%.
Object.prototype.hasOwnProperty ( V )
Когда метод hasOwnProperty вызывается с аргументом V, выполняются следующие шаги:
1. Пусть P будет ? ToPropertyKey(V). 2. Пусть O будет ? ToObject(значение this). 3. Вернуть ? HasOwnProperty(O, P).
Порядок шагов 1 и 2 выбран, чтобы гарантировать, что любое исключение, которое было бы сгенерировано на шаге 1 в предыдущих выпусках этой спецификации, продолжало генерироваться, даже если значение this является undefined или равно null.
Object.prototype.isPrototypeOf ( V )
Когда метод isPrototypeOf вызывается с аргументом V, выполняются следующие шаги:
1. Если Type(V) не является Object, вернуть false. 2. Пусть O будет ? ToObject(значение this). 3. Повторять, a. Установить V на ? V.[[GetPrototypeOf]](). b. Если V равно null, вернуть false. c. Если SameValue(O, V) истинно true, вернуть истину true.
Порядок шагов 1 и 2 сохраняет поведение, указанное в предыдущих редакциях этой спецификации для случая, когда V не является объектом, а значение this является undefined или равно null.
Object.prototype.propertyIsEnumerable ( V )
Когда метод propertyIsEnumerable вызывается с аргументом V, выполняются следующие шаги:
1. Пусть P будет ? ToPropertyKey(V). 2. Пусть O будет ? ToObject(значение this). 3. Пусть desc будет ? O.[[GetOwnProperty]](P). 4. Если desc является undefined, вернуть false. 5. Вернуть desc.[[Enumerable]].
Этот метод не учитывает объекты в цепочке прототипов.
Порядок шагов 1 и 2 выбран, чтобы гарантировать, что любое исключение, которое было бы сгенерировано на шаге 1 в предыдущих выпусках этой спецификации, продолжало генерироваться, даже если значение this является undefined или равно null.
Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
Когда вызывается метод toLocaleString, выполняются следующие шаги:
1. Пусть O будет значением this. 2. Вернуть ? Invoke(O, "toString").
Необязательные параметры этой функции не используются, но предназначены для соответствия шаблону параметров, используемому функциями toLocaleString ECMA-402. Реализации, которые не включают поддержку ECMA-402, не должны использовать эти позиции параметров для других целей.
Эта функция обеспечивает общую реализацию toLocaleString для объектов, не имеющих зависящего от локали поведения toString. Array, Number, Date и %TypedArray% предоставляют собственные методы toLocaleString, зависящие от языкового стандарта.
ECMA-402 намеренно не предоставляет альтернативу этой реализации по умолчанию.
Object.prototype.toString ( )
Когда вызывается метод toString, выполняются следующие шаги:
1. Если значение this является undefined, вернуть "[object Undefined]". 2. Если значение this равно null, вернуть "[object Null]". 3. Пусть O будет ! ToObject(значение this). 4. Пусть isArray будет ? IsArray(O). 5. Если isArray является true, пусть builtinTag будет "Array". 6. Иначе, если O имеет внутренний слот [[ParameterMap]], пусть builtinTag будет "Arguments". 7. Иначе, если O имеет внутренний метод [[Call]], пусть builtinTag будет "Function". 8. Иначе, если O имеет внутренний слот [[ErrorData]], пусть builtinTag будет "Error". 9. Иначе, если O имеет внутренний слот [[BooleanData]], пусть builtinTag будет "Boolean". 10. Иначе, если O имеет внутренний слот [[NumberData]], пусть builtinTag будет "Number". 11. Иначе, если O имеет внутренний слот [[StringData]], пусть builtinTag будет "String". 12. Иначе, если O имеет внутренний слот [[DateValue]], пусть builtinTag будет "Date". 13. Иначе, если O имеет внутренний слот [[RegExpMatcher]], пусть builtinTag будет "RegExp". 14. Иначе, пусть builtinTag будет "Object". 15. Пусть tag будет ? Get(O, @@toStringTag). 16. Если Type(tag) не String, установите tag на builtinTag. 17. Верните конкатенацию строк "[object ", tag и "]".
Исторически эта функция иногда использовалась для доступа к строковому значению внутреннего слота [[Class]], которое использовалось в предыдущих выпусках этой спецификации в качестве тега номинального типа для различных встроенных объектов. Приведенное выше определение toString сохраняет совместимость с устаревшим кодом, который использует toString в качестве теста для этих конкретных типов встроенных объектов. Он не обеспечивает надежного механизма тестирования типов для других типов встроенных или программно определенных объектов. Кроме того, программы могут использовать @@toStringTag способами, которые сделают недействительными такие тесты устаревшего типа.
Object.prototype.valueOf ( )
Когда вызывается метод valueOf, выполняются следующие шаги:
1. Вернуть ? ToObject(значение this).
Свойства экземпляров Object
Экземпляры объектов не имеют особых свойств, кроме унаследованных от объекта-прототипа Object.
Информационные ссылки
Стандарт ECMAScript — Object Objects — https://tc39.es/ecma262/#sec-object-objects