JavaScript | Объекты (Object)

Вступление — Что ты должен знать?

Язык программирования 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:

Объект Человека vasya - JavaScript
Объект Человека vasya — JavaScript

Теперь мы всегда можем обратиться к этому объекту. Мы всегда можем получить информацию по Васе. Для этого достаточно написать название переменной в коде JavaScript-программы:

vasya

В результате мы получим JavaScript-объект с информацией:

Обратились к Васе - JavaScript
Обратились к Васе — JavaScript

Обратите внимание. Когда мы обратились к Васе мы увидели всю его информацию. Но что делать, если мы хотим получить только вес Васи? Как нам получить значение его килограмм? Для этого мы можем обратиться к Ключу «Weight_kg«, который вернёт нам число 70.

vasya.Weight_kg

Что мы сделали? Мы написали название объекта, затем мы поставили точку, после точки мы написали названия нужного поля (ключа) с весом. Так мы обратились к элементу объекта по его ключу и получили значение элемента.

Узнали вес Васи - JavaScript
Узнали вес Васи — JavaScript

Давайте оживим ситуацию и создадим новый Объект «Яблоко». Присвоим этому объекту имя yabloko.

var yabloko = {

Weight_kg: 0.15

}

Внутри Объекта «Яблоко» будет всего один элемент, который обозначает вес яблока. Число 0.15 это в килограммах. А если в граммах, то это равно 150 грамм. Крупное яблоко.

Объект Яблока yabloko - JavaScript
Объект Яблока yabloko — JavaScript

Теперь давайте попробуем описать ситуацию, при которой наш Вася съел 6 таких яблок за вечер. Как нам это записать на JavaScript? Будем идти постепенно — по шагам. Для решения задачи нам нужно получить дополнительные данные. Сначала получим вес одного яблока:

yabloko.Weight_kg
Узнали вес одного яблока - JavaScript
Узнали вес одного яблока — JavaScript

Отлично! Теперь узнаем вес 6-ти яблок.

yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg + yabloko.Weight_kg
Вес шести яблок - JavaScript
Вес шести яблок — JavaScript

Мы сложили вес шести яблок в один и получили значение 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)
Вася покушал яблоки - JavaScript
Вася покушал яблоки — JavaScript

То что справа от равенства мы присвоили тому что слева от равенства. То есть сначала сложились все веса, а потом итоговый вес присвоился Значению по Ключу Weight_kg объекта vasya.

В чём магия объектов? Теперь, если мы обратимся к объекту vasya, то мы увидим новые данные в том же самом поле. То есть мы всегда сможем узнавать вес Васи одной командой, но значение веса будет меняться когда угодно. Одно не зависит от другого. Всё хранится на своих местах — в элементах Объекта.

Накормили Васю яблоками - JavaScript
Накормили Васю яблоками — JavaScript

 

JavaScript | Как создать объект?

 

Тип данных 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, объект использует методы, определенные в 9.1.
  • Если у объекта есть внутренний метод [[Call]], он использует метод, определенный в 9.2.1.
  • Если у объекта есть внутренний метод [[Construct]], он использует метод, определенный в 9.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]]
(propertyKey Undefined | Property Descriptor
Вернуть «дескриптор свойства» (Property Descriptor) для собственного свойства этого объекта, ключ которого — propertyKey, или undefined, если такого свойства не существует.
[[DefineOwnProperty]] (propertyKeyPropertyDescriptor Boolean Создайте или измените собственное свойство, ключ которого — propertyKey, чтобы его состояние описывалось PropertyDescriptor. Верните true, если это свойство было успешно создано / обновлено, или false, если свойство не может быть создано или обновлено.
[[HasProperty]] (propertyKey Boolean Верните логическое значение, указывающее, есть ли у этого объекта собственное или унаследованное свойство, ключ которого — propertyKey.
[[Get]] (propertyKey, Receiver) → any Вернуть значение свойства, ключ которого — propertyKey из этого объекта. Если какой-либо код ECMAScript должен быть выполнен для получения значения свойства, Receiver используется как значение this при оценке кода.
[[Set]] (propertyKeyvalueReceiver 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.
Примечание 1

Внутренний метод не должен возвращать завершение с [[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.
Примечание 2

Цепочка прототипов объекта должна иметь конечную длину (то есть, начиная с любого объекта, рекурсивное применение внутреннего метода [[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 ).
Примечание 3

Как следствие третьего инварианта, если свойство описывается как свойство данных и может возвращать разные значения с течением времени, тогда один или оба атрибута [[Writable]] и [[Configurable]] должны быть истинными, даже если нет механизма изменения значения предоставляется через другие важные внутренние методы.

 

[[DefineOwnProperty]] ( P, Desc )

Обычный тип возвращаемого значения — логический (Boolean).

[[DefineOwnProperty]] должен возвращать false, если P ранее наблюдалось как не настраиваемое собственное свойство цели, кроме случаев:

  1. P — это свойство данных с возможностью записи. Ненастраиваемое свойство данных с возможностью записи может быть изменено на ненастраиваемое свойство данных с возможностью записи.
  2. Все атрибуты 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]] ( )

[[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».
  • имеет следующие дополнительные свойства:

 

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.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 и 2 выбран, чтобы гарантировать, что любое исключение, которое было бы сгенерировано на шаге 1 в предыдущих выпусках этой спецификации, продолжало генерироваться, даже если значение this является undefined или равно null.

 

Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

Когда вызывается метод toLocaleString, выполняются следующие шаги:

1. Пусть O будет значением this.
2. Вернуть ? Invoke(O, "toString").

Необязательные параметры этой функции не используются, но предназначены для соответствия шаблону параметров, используемому функциями toLocaleString ECMA-402. Реализации, которые не включают поддержку ECMA-402, не должны использовать эти позиции параметров для других целей.

Примечание 1

Эта функция обеспечивает общую реализацию toLocaleString для объектов, не имеющих зависящего от локали поведения toString. Array, Number, Date и %TypedArray% предоставляют собственные методы toLocaleString, зависящие от языкового стандарта.

Примечание 2

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.

 

Информационные ссылки

Стандарт ECMAScriptObject Objectshttps://tc39.es/ecma262/#sec-object-objects

Поделись записью