Спецификация ECMAScript 5.1 с аннотациями

Поделиться

15.2 Объекты Object #

15.2.1 Вызов конструктора Object как функции #

При вызове Object не в качестве конструктора, а в качестве функции, производится преобразование типов.

15.2.1.1 Object ( [ value ] ) #

При вызове функции Object без аргументов или с одним аргументом value выполняются следующие шаги:

  1. Если value равно null, undefined, или отсутствует, то создать и вернуть новый объект Object, как если бы был вызван стандартный встроенный конструктор Object с этими аргументами (15.2.2.1).

  2. Вернуть ToObject(value).

15.2.2 Конструктор Object #

Если Object вызывается как часть выражения new, он является конструктором, который может создать объект.

15.2.2.1 new Object ( [ value ] ) #

При вызове конструктора Object без аргументов или с одним аргументом value выполняются следующие шаги:

  1. Если value присутствует, то

    1. Если Type(value) – Object, то

      1. Если value является родным объектом ECMAScript, то не нужно создавать новый объект, а просто вернуть value.

      2. Если value является объектом среды, то необходимо выполнить шаги и вернуть результат, которые обусловлены реализацией, зависящей от родного объекта.

    2. Если Type(value) равно String, вернуть ToObject(value).

    3. Если Type(value) равно Boolean, вернуть ToObject(value).

    4. Если Type(value) равно Number, вернуть ToObject(value).

  2. Дано: Аргумент value не был передан, или его тип – Null или Undefined.

  3. Пусть obj будет новым родным объектом ECMAScript.

  4. Присвоить внутреннему свойству [[Prototype]] для obj значение стандартного встроенного объекта-прототипа Object (15.2.4).

  5. Внутреннему свойству [[Class]] для obj присвоить "Object".

  6. Присвоить внутреннему свойству [[Extensible]] для obj значение true.

  7. Установить все внутренние методы для obj, как описано в пункте 8.12.

  8. Вернуть obj.

15.2.3 Свойства конструктора Object #

Значением внутреннего свойства [[Prototype]] конструктора Object является стандартный встроенный объект-прототип Function.

В дополнение ко внутренним свойствам и к свойству length со значением 1, конструктор Object имеет следующие свойства:

15.2.3.1 Object.prototype #

Начальным значением Object.prototype является стандартный встроенный объект-прототип Object (15.2.4).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.2.3.2 Object.getPrototypeOf ( O ) #

При вызове функции getPrototypeOf с аргументом O выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Вернуть значение внутреннего свойства [[Prototype]] для O.

15.2.3.3 Object.getOwnPropertyDescriptor ( O, P ) #

При вызове функции getOwnPropertyDescriptor выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Пусть name будет ToString(P).

  3. Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом name.

  4. Вернуть результат вызова FromPropertyDescriptor(desc) (8.10.4).

15.2.3.4 Object.getOwnPropertyNames ( O ) #

При вызове функции getOwnPropertyNames выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Пусть array будет результатом создания нового объекта, как если бы этот объект был создан выражением new Array(), где Array является стандартным встроенным конструктором с этим именем.

  3. Пусть n будет 0.

  4. Для каждого собственного именованного свойства P для  O

    1. Пусть name будет строковым значением, которое является именем P.

    2. Вызвать внутренний метод [[DefineOwnProperty]] для array с аргументами ToString(n), PropertyDescriptor {[[Value]]: name, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

    3. Увеличить n на 1.

  5. Вернуть array.

ПРИМЕЧАНИЕ Если O – экземпляр строки, то набор собственных свойств, обрабатываемых в шаге 4, включает неявные свойства, определяемые в пункте 15.5.5.2, которые соответствуют позициям символов в строке [[PrimitiveValue]] этого объекта.

15.2.3.5 Object.create ( O [, Properties] ) #

Функция create создаёт новый объект с заданным прототипом. При вызове функции create выполняются следующие шаги:

  1. Если Type(O) – не Object и не Null, сгенерировать исключение TypeError.

  2. Пусть obj будет результатом создания нового объекта, как если бы этот объект был создан выражением new Object(), где Object является стандартным встроенным конструктором с этим именем.

  3. Присвоить внутреннему свойству [[Prototype]] для obj значение O.

  4. Если имеется аргумент Properties, и он не является undefined, то добавить к obj собственные свойства, как если бы они были добавлены вызовом стандартной встроенной функции Object.defineProperties с аргументами obj и Properties.

  5. Вернуть obj.

15.2.3.6 Object.defineProperty ( O, P, Attributes ) #

Функция defineProperty применяется для добавления нового собственного свойства и/или добавления атрибутов уже существующего собственного свойства объекта. При вызове функции defineProperty выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Пусть name будет ToString(P).

  3. Пусть desc будет результатом вызова абстрактной операции ToPropertyDescriptor с передачей Attributes в качестве аргумента.

  4. Вызвать внутренний метод [[DefineOwnProperty]] для O с аргументами name, desc и true.

  5. Вернуть O.

15.2.3.7 Object.defineProperties ( O, Properties ) #

Функция defineProperties применяется для добавления собственных свойств и/или добавления атрибутов уже существующих собственных свойств объекта. При вызове функции defineProperties выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Пусть props будет ToObject(Properties).

  3. Пусть names будет внутренним списком с именами каждого перечислимого собственного свойства для props.

  4. Пусть descriptors будет пустой внутренний список List.

  5. Для каждого элемента P в names по порядку списка выполняется следующее:

    1. Пусть descObj будет результатом вызова внутреннего метода [[Get]] для props с передачей P в качестве аргумента.

    2. Пусть desc будет результатом вызова абстрактной операции ToPropertyDescriptor с передачей descObj в качестве аргумента.

    3. В конце descriptors присоединить desc.

  6. Для каждого элемента desc в descriptors по порядку списка:

    1. Вызвать внутренний метод [[DefineOwnProperty]] для O с аргументами P, desc и true.

  7. Вернуть O.

Если реализация определяет конкретный порядок перечисления в "for-in", то для расположения по порядку элементов списка в шаге 3 данного алгоритма необходимо использовать именно этот порядок перечисления.

15.2.3.8 Object.seal ( O ) #

При вызове функции seal выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Для каждого собственного именованного свойства P для O:

    1. Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.

    2. Если desc.[[Configurable]] равно true, то присвоить desc.[[Configurable]] значение false.

    3. Вызвать внутренний метод [[DefineOwnProperty]] для O с аргументами P, desc и true.

  3. Присвоить внутреннему свойству [[Extensible]] для O значение false.

  4. Вернуть O.

15.2.3.9 Object.freeze ( O ) #

При вызове функции freeze выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Для каждого собственного именованного свойства P для O:

    1. Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.

    2. Если IsDataDescriptor(desc) – true, то

      1. Если desc.[[Writable]] равно true, то присвоить desc.[[Writable]] значение false.

    3. Если desc.[[Configurable]] равно true, то присвоить desc.[[Configurable]] значение false.

    4. Вызвать внутренний метод [[DefineOwnProperty]] для O с аргументами P, desc и true.

  3. Присвоить внутреннему свойству [[Extensible]] для O значение false.

  4. Вернуть O.

15.2.3.10 Object.preventExtensions ( O ) #

При вызове функции preventExtensions выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Присвоить внутреннему свойству [[Extensible]] для O значение false.

  3. Вернуть O.

15.2.3.11 Object.isSealed ( O ) #

При вызове функции isSealed с аргументом O выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Для каждого собственного именованного свойства P для O:

    1. Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.

    2. Если desc.[[Configurable]] – true, то вернуть false.

  3. Если внутреннее свойство [[Extensible]] для Ofalse, вернуть true.

  4. В противном случае вернуть false.

15.2.3.12 Object.isFrozen ( O ) #

При вызове функции isFrozen с аргументом O выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Для каждого собственного именованного свойства P для O:

    1. Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.

    2. Если IsDataDescriptor(desc) – true, то

      1. Если desc.[[Writable]] – true, то вернуть false.

    3. Если desc.[[Configurable]] – true, то вернуть false.

  3. Если внутреннее свойство [[Extensible]] для Ofalse, вернуть true.

  4. В противном случае вернуть false.

15.2.3.13 Object.isExtensible ( O ) #

При вызове функции isExtensible с аргументом O выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Вернуть булево значение внутреннего свойства [[Extensible]] для O.

15.2.3.14 Object.keys ( O ) #

При вызове функции keys с аргументом O выполняются следующие шаги:

  1. Если Type(O) – не Object, сгенерировать исключение TypeError.

  2. Пусть n будет количеством собственных перечислимых свойств для O

  3. Пусть array будет результатом создания нового объекта Object, как если бы этот объект был создан выражением new Array(n), где Array является стандартным встроенным конструктором с этим именем.

  4. Пусть index будет 0.

  5. Для каждого собственного перечислимого свойства для O с именем строки P:

    1. Вызвать внутренний метод [[DefineOwnProperty]] для array с аргументами ToString(index), PropertyDescriptor {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

    2. Увеличить index на 1.

  6. Вернуть array.

Если реализация определяет конкретный порядок перечисления в "for-in", то в шаге 5 данного алгоритма необходимо использовать именно этот порядок перечисления.

15.2.4 Свойства объекта-прототипа Object #

Значение внутреннего свойства [[Prototype]] объекта-прототипа Object равно null, значение внутреннего свойства [[Class]] равно "Object", начальное значение внутреннего свойства [[Extensible]] равно true.

15.2.4.1 Object.prototype.constructor #

Начальным значением Object.prototype.constructor является стандартный встроенный конструктор Object.

15.2.4.2 Object.prototype.toString ( ) #

При вызове метода toString выполняются следующие шаги:

  1. Если значение thisundefined, вернуть "[object Undefined]".

  2. Если значение thisnull, вернуть "[object Null]".

  3. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  4. Пусть class будет значением внутреннего свойства [[Class]] для O.

  5. Вернуть строковое значение, полученное в результате конкатенации трёх строк "[object ", class, и "]".

15.2.4.3 Object.prototype.toLocaleString ( ) #

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

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть toString будет результатом вызова внутреннего метода [[Get]] для O с передачей "toString" в качестве аргумента.

  3. Если IsCallable(toString) – false, сгенерировать исключение TypeError.

  4. Вернуть результат вызова внутреннего метода [[Call]] для toString, передавая O в качестве значения this, и не передавая аргументов.

ПРИМЕЧАНИЕ 1 Эта функция предназначена для того, чтобы предоставить всем объектам родовой интерфейс toLocaleString, хотя не все объекты могут его использовать. В настоящее время Array, Number и Date предоставляют собственные местные методы toLocaleString.

ПРИМЕЧАНИЕ 2 Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.

15.2.4.4 Object.prototype.valueOf ( ) #

При вызове метода valueOf выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Если O – результат вызова конструктора Object с объектом среды (15.2.2.1), то

    1. Вернуть O или другое значение, которое объект среды изначально передал в конструктор. Конкретный возвращаемый результат зависит от реализации.

  3. Вернуть O.

15.2.4.5 Object.prototype.hasOwnProperty (V) #

При вызове метода hasOwnProperty с аргументом V выполняются следующие шаги:

  1. Пусть P будет ToString(V).

  2. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  3. Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] для O с передачей P в качестве аргумента.

  4. Если descundefined, вернуть false.

  5. Вернуть true.

ПРИМЕЧАНИЕ 1 В отличие от метода [[HasProperty]] (8.12.6), этот метод не рассматривает объекты в цепочке прототипов.

ПРИМЕЧАНИЕ 2 Порядок шагов 1 и 2 выбран таким образом, чтобы все исключения, которые были бы сгенерированы в процессе шага 1 в предыдущих версиях спецификации, продолжали генерироваться, даже если значение this равно undefined или null.

15.2.4.6 Object.prototype.isPrototypeOf (V) #

При вызове метода isPrototypeOf с аргументом V выполняются следующие шаги:

  1. Если V – не объект, вернуть false.

  2. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  3. Повторить

    1. Пусть V будет значением внутреннего свойства [[Prototype]] для V.

    2. Если Vnull, вернуть false

    3. Если O и V относятся к одному и тому же объекту, вернуть true.

ПРИМЕЧАНИЕ Порядок шагов 1 и 2 выбран таким образом, чтобы сохранить поведение, заданное в предыдущих версиях данной спецификации для того случая, если V – не объект, а значение this равно undefined или null.

15.2.4.7 Object.prototype.propertyIsEnumerable (V) #

При вызове метода propertyIsEnumerable с аргументом V выполняются следующие шаги:

  1. Пусть P будет ToString(V).

  2. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  3. Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] для O с передачей P в качестве аргумента.

  4. Если descundefined, вернуть false.

  5. Вернуть значение desc.[[Enumerable]].

ПРИМЕЧАНИЕ 1 Этот метод не рассматривает объекты в цепочке прототипов.

ПРИМЕЧАНИЕ 2 Порядок шагов 1 и 2 выбран таким образом, чтобы все исключения, которые были бы сгенерированы в процессе шага 1 в предыдущих версиях спецификации, продолжали генерироваться, даже если значение this равно undefined или null.

15.2.5 Свойства экземпляров Object #

Экземпляры Object не имеют специальных свойств, кроме унаследованных от объекта-прототипа Object.