Указатель содержания
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.
Дайте мне знать в комментариях, если у вас есть какие-либо вопросы или предложения по этой записи.