JavaScript: Добавление свойств к запечатанному объекту должно вызвать исключение ошибки типа? - PullRequest
2 голосов
/ 30 марта 2011

Предположим, у меня есть что-то вроде этого в JavaScript:

var obj = { name: "Luis" };
Object.seal( obj );

obj.address = "Fx"; //what should happen here?

Итак, каково правильное поведение?Это не в строгом режиме, поэтому я предположил, что строка obj.address будет просто игнорироваться.Тем не менее, это не так, поскольку он добавляет Chrome.Я смотрю на тесты для V8, и кажется, что он должен выдавать только в строгом режиме:

код теста object.seal: http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/object-seal.js?spec=svn7379&r=7379

и вот некоторый код из этого файла:

Object.seal(obj);

// Make sure we are no longer extensible.
assertFalse(Object.isExtensible(obj));
assertTrue(Object.isSealed(obj));

// We should not be frozen, since we are still able to
// update values.
assertFalse(Object.isFrozen(obj));

// We should not allow new properties to be added.
obj.foo = 42;
assertEquals(obj.foo, undefined);

Кстати, есть тесты из строгого режима, где мой пример явно выбросит: http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/strict-mode.js?spec=svn7250&r=7250

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Object.seal делает 2 вещи.

1) Устанавливает внутренний атрибут [[Extensible]] объекта в значение false.

2) Перебирает все собственные свойства объекта и устанавливает для их внутреннего атрибута [[Configurable]] значение false.

Это в значительной степени означает, что вы не можете добавить какие-либо свойства к объекту после его запечатывания. Обратите внимание, что существующие свойства все еще могут быть изменены , если объект не заморожен (или если назначаемое свойство не сделано явным образом недоступным для записи ).

В вашем случае вы добавляете другое свойство к запечатанному объекту, поэтому в ES5-нестрогом оно должно быть игнорируется , тогда как в ES5-строгом оно должно приводить к TypeError (как вы можете видеть из 11.3.1 (Простое назначение) ; более конкретно, вы можете отследить его до [[CanPut]], который в значительной степени возвращает значение [[Extensible]] - false - in этот случай, а затем [[Put]] либо выбрасывает, если это строгий режим, либо нет).

Так что нет, Chrome здесь не должен кидаться (в нестрогом режиме).

1 голос
/ 30 марта 2011

IE9: не бросает
Chrome: бросает
Firefox 4: бросает только в коде строгого режима

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...