Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Object.freeze()

Сводка

Метод Object.freeze() замораживает объект: это значит, что он предотвращает добавление новых свойств к объекту, удаление старых свойств из объекта и изменение существующих свойств или значения их атрибутов перечисляемости, настраиваемости и записываемости. В сущности, объект становится эффективно неизменным. Метод возвращает замороженный объект.

Синтаксис

Object.freeze(obj)

Параметры

obj
Объект для заморозки.

Описание

К замороженному объекту нельзя добавить никаких свойств, так же как и удалить свойства из замороженного объекта. Любые попытки сделать это потерпят неудачу, либо молча, либо выбросив исключение TypeError (как правило, но не обязательно, это происходит в строгом режиме).

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

Примеры

var obj = {
  prop: function() {},
  foo: 'bar'
};

// Можно добавлять новые свойства, существующие свойства можно изменять или удалять
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;

var o = Object.freeze(obj);

assert(Object.isFrozen(obj) === true);

// Теперь все изменения будут заканчиваться с ошибкой
obj.foo = 'quux'; // тихо ничего не делает
obj.quaxxor = 'the friendly duck'; // тихо не добавляет свойство

// ...а в строгом режиме такие попытки вызовут выброс исключения TypeError
function fail() {
  'use strict';
  obj.foo = 'sparky'; // выбросит TypeError
  delete obj.quaxxor; // выбросит TypeError
  obj.sparky = 'arf'; // выбросит TypeError
}

fail();

// Попытки внести изменения через метод Object.defineProperty также выбросят исключение
Object.defineProperty(obj, 'ohai', { value: 17 }); // выбросит TypeError
Object.defineProperty(obj, 'foo', { value: 'eit' }); // выбросит TypeError

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

obj = {
  internal: {}
};

Object.freeze(obj);
obj.internal.a = 'значениеA';

obj.internal.a // 'значениеA'

// Чтобы сделать объект obj полностью неизменяемым, замораживаем каждый объект в объекте obj.
// Для этого воспользуемся этой функцией.
function deepFreeze(o) {
  var prop, propKey;
  Object.freeze(o); // Сначала замораживаем сам объект.
  for (propKey in o) {
    prop = o[propKey];
    if (!o.hasOwnProperty(propKey) || !(typeof prop === 'object') || Object.isFrozen(prop)) {
      // Если объект находится в прототипе, не является объектом, либо уже заморожен,
      // пропускаем его. Обратите внимание, что функция может оставить незамороженными ссылки в
      // объекте, если уже замороженный объект содержал не замороженный объект.
      continue;
    }

    deepFreeze(prop); // Рекурсивно вызываем deepFreeze.
  }
}

obj2 = {
  internal: {}
};

deepFreeze(obj2);
obj2.internal.a = 'другоеЗначение';
obj2.internal.a; // undefined

Примечания

В ES5, если аргумент метода не является объектом (является примитивным значением), будет выброшено исключение TypeError. В ES6 такой аргумент будет рассматриваться, как простой замороженный объект и метод его просто вернёт.

> Object.freeze(1)
TypeError: 1 is not an object // код ES5

> Object.freeze(1)
1                             // код ES6

Спецификации

Спецификация Статус Комментарии
ECMAScript 5.1 (ECMA-262)
Определение 'Object.freeze' в этой спецификации.
Стандарт Изначальное определение. Реализована в JavaScript 1.8.5.
ECMAScript 6 (ECMA-262)
Определение 'Object.freeze' в этой спецификации.
Кандидат в рекомендации  

Совместимость с браузерами

Возможность Firefox (Gecko) Chrome Internet Explorer Opera Safari
Базовая поддержка 4.0 (2) 6 9 12 5.1
Возможность Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
Базовая поддержка ? ? ? ? ?

На основе таблицы совместимости Kangax.

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: chayn1k, Mingun
 Обновлялась последний раз: chayn1k,