Указатель содержания

1. Object.freeze ()
2. Object.seal ()
3. Заключение

1. Object.freeze ()

Что именно означает, что объект будет заморожен? Может быть, по какой-то причине мы больше не можем им пользоваться? Или, может быть, он ждет какого-то действия (солнца?), Чтобы его снова использовали? Фактически, это просто метод, который не позволяет
добавлять к такому объекту новые свойства, удалять существующие и изменять текущий прототип такого объекта. Синтаксис довольно прост:

Object.freeze(someObject);

Будет возвращен объект в замороженном состоянии.

Давайте посмотрим на несколько примеров того, что мы можем и что не можем делать с замороженным объектом:

const sampleObject = {
 prop1: 'some string',
 prop2: 5,
 prop3: {
  innerProp: 'changeable'
 }
};

const frozenObject = Object.freeze(sampleObject);
frozenObject.prop1 = 'some other string'; // Uncaught TypeError

Попытка изменить свойство prop1 будет неудачной, и мы получим следующую ошибку:

Uncaught TypeError: Cannot assign to read only property ‘prop1’ of object ‘#<Object>’

Хотя мы все равно можем изменить значение свойства, если это объект:

// no error, new value is set
frozenObject.prop3.innerProp = 'changed';

Если такое поведение нежелательно, мы можем предотвратить его, выполнив:

Object.freeze(frozenObject.prop3); 
// Uncaught TypeError
frozenObject.prop3.innerProp = 'will not be set'; 

Некоторые другие запрещенные операции:

// Cannot delete property 'prop2' of #<Object>
delete frozenObject.prop2; 
// Cannot define property key, object is not extensible
Object.defineProperty(frozenObject, 'key', { 
 enumerable: true, // default is false
 configurable: true, // default is false
 writable: true // default is false
});

Мы можем проверить, заморожен ли объект, используя

Object.isFrozen(someObject)

Обратите внимание, что исходный объект также становится замороженным:

Object.isFrozen(sampleObject); // true
Object.isFrozen(frozenObject); // true
Object.isFrozen({ a: 5, b: 6 }); // false

2. Object.seal ()

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

const toBeSealed = {
 prop1: 'some value',
 prop2: 'some other value'
};

const sealedObject = Object.seal(toBeSealed);

sealedObject.prop1 = 'new value'; // no error, value changed
// Cannot add property newProp, object is not extensible
sealedObject.newProp = 'won\'t be added'; 
// Cannot delete property 'prop2' of #<Object>
delete sealedObject.prop2; 
// Cannot define property newProp, object is not extensible
Object.defineProperty(sealedObject, 'newProp', { 
 writable: true
});

Метод проверки герметичности объекта довольно интуитивно понятен:

Object.isSealed(sealedObject); // true
Object.isSealed(toBeSealed); // true
Object.isSealed({}); // false

3. Заключение

И Object.freeze (), и Object.seal () работают с неизменяемостью объекта. Основное различие между ними состоит в том, что в случае Object.seal () мы можем изменять значения определенных свойств. Методы проверки того, заморожен или запечатан объект, интуитивно понятны и возвращают логическое значение: Object.isFrozen ()
и Object.isSealed (). Вы также можете взглянуть на метод
Object.preventExtensions (), чтобы глубже разобраться в теме неизменяемости объекта. В качестве бонуса взгляните на тест скорости для обоих методов на jsPerf.

Дайте мне знать в комментариях, если у вас есть какие-либо вопросы или предложения по этой записи.