При вызове Object
не в качестве конструктора, а в качестве функции, производится преобразование типов.
При вызове функции Object
без аргументов или с одним аргументом value выполняются следующие шаги:
Если value равно null, undefined, или отсутствует, то создать и вернуть новый объект Object, как если бы был вызван стандартный встроенный конструктор Object с этими аргументами (15.2.2.1).
Вернуть ToObject(value).
Если Object
вызывается как часть выражения new
, он является конструктором, который может создать объект.
При вызове конструктора Object
без аргументов или с одним аргументом value выполняются следующие шаги:
Если value присутствует, то
Если Type(value) – Object, то
Если value является родным объектом ECMAScript, то не нужно создавать новый объект, а просто вернуть value.
Если value является объектом среды, то необходимо выполнить шаги и вернуть результат, которые обусловлены реализацией, зависящей от родного объекта.
Дано: Аргумент value не был передан, или его тип – Null или Undefined.
Пусть obj будет новым родным объектом ECMAScript.
Присвоить внутреннему свойству [[Prototype]] для obj значение стандартного встроенного объекта-прототипа Object (15.2.4).
Внутреннему свойству [[Class]] для obj присвоить "Object"
.
Присвоить внутреннему свойству [[Extensible]] для obj значение true.
Установить все внутренние методы для obj, как описано в пункте 8.12.
Вернуть obj.
Значением внутреннего свойства [[Prototype]] конструктора Object является стандартный встроенный объект-прототип Function.
В дополнение ко внутренним свойствам и к свойству length
со значением 1, конструктор Object имеет следующие свойства:
Начальным значением Object.prototype
является стандартный встроенный объект-прототип Object (15.2.4).
Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
При вызове функции getPrototypeOf
с аргументом O выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Вернуть значение внутреннего свойства [[Prototype]] для O.
При вызове функции getOwnPropertyDescriptor выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Пусть name будет ToString(P).
Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом name.
Вернуть результат вызова FromPropertyDescriptor(desc) (8.10.4).
При вызове функции getOwnPropertyNames выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Пусть array будет результатом создания нового объекта, как если бы этот объект был создан выражением new Array()
, где Array
является стандартным встроенным конструктором с этим именем.
Пусть n будет 0.
Для каждого собственного именованного свойства P для O
Пусть name будет строковым значением, которое является именем P.
Вызвать внутренний метод [[DefineOwnProperty]] для array с аргументами ToString(n), PropertyDescriptor {[[Value]]: name, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.
Увеличить n на 1.
Вернуть array.
ПРИМЕЧАНИЕ Если O – экземпляр строки, то набор собственных свойств, обрабатываемых в шаге 4, включает неявные свойства, определяемые в пункте 15.5.5.2, которые соответствуют позициям символов в строке [[PrimitiveValue]] этого объекта.
Функция create создаёт новый объект с заданным прототипом. При вызове функции create выполняются следующие шаги:
Если Type(O) – не Object и не Null, сгенерировать исключение TypeError.
Пусть obj будет результатом создания нового объекта, как если бы этот объект был создан выражением new Object(), где Object является стандартным встроенным конструктором с этим именем.
Присвоить внутреннему свойству [[Prototype]] для obj значение O.
Если имеется аргумент Properties, и он не является undefined, то добавить к obj собственные свойства, как если бы они были добавлены вызовом стандартной встроенной функции Object.defineProperties
с аргументами obj и Properties.
Вернуть obj.
Функция defineProperty применяется для добавления нового собственного свойства и/или добавления атрибутов уже существующего собственного свойства объекта. При вызове функции defineProperty выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Пусть name будет ToString(P).
Пусть desc будет результатом вызова абстрактной операции ToPropertyDescriptor с передачей Attributes в качестве аргумента.
Вызвать внутренний метод [[DefineOwnProperty]] для O с аргументами name, desc и true.
Вернуть O.
Функция defineProperties применяется для добавления собственных свойств и/или добавления атрибутов уже существующих собственных свойств объекта. При вызове функции defineProperties выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Пусть props будет ToObject(Properties).
Пусть names будет внутренним списком с именами каждого перечислимого собственного свойства для props.
Пусть descriptors будет пустой внутренний список List.
Для каждого элемента P в names по порядку списка выполняется следующее:
Пусть descObj будет результатом вызова внутреннего метода [[Get]] для props с передачей P в качестве аргумента.
Пусть desc будет результатом вызова абстрактной операции ToPropertyDescriptor с передачей descObj в качестве аргумента.
В конце descriptors присоединить desc.
Для каждого элемента desc в descriptors по порядку списка:
Вызвать внутренний метод [[DefineOwnProperty]] для O с аргументами P, desc и true.
Вернуть O.
Если реализация определяет конкретный порядок перечисления в "for-in", то для расположения по порядку элементов списка в шаге 3 данного алгоритма необходимо использовать именно этот порядок перечисления.
При вызове функции seal выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Для каждого собственного именованного свойства P для O:
Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.
Если desc.[[Configurable]] равно true, то присвоить desc.[[Configurable]] значение false.
Вызвать внутренний метод [[DefineOwnProperty]] для O с аргументами P, desc и true.
Присвоить внутреннему свойству [[Extensible]] для O значение false.
Вернуть O.
При вызове функции freeze выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Для каждого собственного именованного свойства P для O:
Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.
Если IsDataDescriptor(desc) – true, то
Если desc.[[Writable]] равно true, то присвоить desc.[[Writable]] значение false.
Если desc.[[Configurable]] равно true, то присвоить desc.[[Configurable]] значение false.
Вызвать внутренний метод [[DefineOwnProperty]] для O с аргументами P, desc и true.
Присвоить внутреннему свойству [[Extensible]] для O значение false.
Вернуть O.
При вызове функции preventExtensions выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Присвоить внутреннему свойству [[Extensible]] для O значение false.
Вернуть O.
При вызове функции isSealed с аргументом O выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Для каждого собственного именованного свойства P для O:
Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.
Если desc.[[Configurable]] – true, то вернуть false.
Если внутреннее свойство [[Extensible]] для O – false, вернуть true.
В противном случае вернуть false.
При вызове функции isFrozen с аргументом O выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Для каждого собственного именованного свойства P для O:
Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.
Если IsDataDescriptor(desc) – true, то
Если desc.[[Writable]] – true, то вернуть false.
Если desc.[[Configurable]] – true, то вернуть false.
Если внутреннее свойство [[Extensible]] для O – false, вернуть true.
В противном случае вернуть false.
При вызове функции isExtensible с аргументом O выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Вернуть булево значение внутреннего свойства [[Extensible]] для O.
При вызове функции keys с аргументом O выполняются следующие шаги:
Если Type(O) – не Object, сгенерировать исключение TypeError.
Пусть n будет количеством собственных перечислимых свойств для O
Пусть array будет результатом создания нового объекта Object, как если бы этот объект был создан выражением new Array(n)
, где Array
является стандартным встроенным конструктором с этим именем.
Пусть index будет 0.
Для каждого собственного перечислимого свойства для O с именем строки P:
Вызвать внутренний метод [[DefineOwnProperty]] для array с аргументами ToString(index), PropertyDescriptor {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.
Увеличить index на 1.
Вернуть array.
Если реализация определяет конкретный порядок перечисления в "for-in", то в шаге 5 данного алгоритма необходимо использовать именно этот порядок перечисления.
Значение внутреннего свойства [[Prototype]] объекта-прототипа Object равно null, значение внутреннего свойства [[Class]] равно "Object"
, начальное значение внутреннего свойства [[Extensible]] равно true.
Начальным значением Object.prototype.constructor
является стандартный встроенный конструктор Object
.
При вызове метода toString
выполняются следующие шаги:
Если значение this – undefined, вернуть "[object Undefined]".
Если значение this – null, вернуть "[object Null]".
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть class будет значением внутреннего свойства [[Class]] для O.
Вернуть строковое значение, полученное в результате конкатенации трёх строк "[object ", class, и "]".
При вызове метода toLocaleString выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть toString будет результатом вызова внутреннего метода [[Get]] для O с передачей "toString" в качестве аргумента.
Если IsCallable(toString) – false, сгенерировать исключение TypeError.
Вернуть результат вызова внутреннего метода [[Call]] для toString, передавая O в качестве значения this, и не передавая аргументов.
ПРИМЕЧАНИЕ 1 Эта функция предназначена для того, чтобы предоставить всем объектам родовой интерфейс toLocaleString
, хотя не все объекты могут его использовать. В настоящее время Array
, Number
и Date
предоставляют собственные местные методы toLocaleString
.
ПРИМЕЧАНИЕ 2 Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.
При вызове метода valueOf выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Если O – результат вызова конструктора Object с объектом среды (15.2.2.1), то
Вернуть O или другое значение, которое объект среды изначально передал в конструктор. Конкретный возвращаемый результат зависит от реализации.
Вернуть O.
При вызове метода hasOwnProperty
с аргументом V выполняются следующие шаги:
Пусть P будет ToString(V).
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] для O с передачей P в качестве аргумента.
Если desc – undefined, вернуть false.
Вернуть true.
ПРИМЕЧАНИЕ 1 В отличие от метода [[HasProperty]] (8.12.6), этот метод не рассматривает объекты в цепочке прототипов.
ПРИМЕЧАНИЕ 2 Порядок шагов 1 и 2 выбран таким образом, чтобы все исключения, которые были бы сгенерированы в процессе шага 1 в предыдущих версиях спецификации, продолжали генерироваться, даже если значение this равно undefined или null.
При вызове метода isPrototypeOf
с аргументом V выполняются следующие шаги:
Если V – не объект, вернуть false.
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Повторить
Пусть V будет значением внутреннего свойства [[Prototype]] для V.
Если V – null, вернуть false
Если O и V относятся к одному и тому же объекту, вернуть true.
ПРИМЕЧАНИЕ Порядок шагов 1 и 2 выбран таким образом, чтобы сохранить поведение, заданное в предыдущих версиях данной спецификации для того случая, если V – не объект, а значение this равно undefined или null.
При вызове метода propertyIsEnumerable
с аргументом V выполняются следующие шаги:
Пусть P будет ToString(V).
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] для O с передачей P в качестве аргумента.
Если desc – undefined, вернуть false.
Вернуть значение desc.[[Enumerable]].
ПРИМЕЧАНИЕ 1 Этот метод не рассматривает объекты в цепочке прототипов.
ПРИМЕЧАНИЕ 2 Порядок шагов 1 и 2 выбран таким образом, чтобы все исключения, которые были бы сгенерированы в процессе шага 1 в предыдущих версиях спецификации, продолжали генерироваться, даже если значение this равно undefined или null.
Экземпляры Object не имеют специальных свойств, кроме унаследованных от объекта-прототипа Object.