Selar, congelar e impedir a extensão de um objeto em JavaScript
Aprenda a selar, congelar e impedir extensões de objetos em JavaScript com Ignite UI para JavaScript por Infragistics
No JavaScript moderno, os objetos são integrais e ter uma forte compreensão dos tópicos que cercam os objetos é necessário para escrever um JavaScript melhor. Você pode criar um objeto de quatro maneiras em JavaScript.
Depois de saber como criar um objeto, você pode querer aprender sobre descritores de propriedades de objeto. Como recapitulação, digamos que você tenha um objeto –gato:
var cat = { name: 'foo', age: 9 }
Cada propriedade de objeto contém mais informações do que apenas um valor. Por exemplo, você pode imprimir outras informações de propriedade usando o método Object.getOwnPropertyDescriptor
console.log(Object.getOwnPropertyDescriptor(cat, 'name'));
No console, você pode ver que um nome de propriedade oferece mais informações:

Como está muito claro, se gravável estiver definido como true, você pode reescrever um valor de propriedade, etc.
A partir de agora, você conhece os descritores de propriedade de objeto, portanto, se for necessário tornar uma propriedade somente leitura, você definirá a propriedade gravável como false.
Object.defineProperty(cat, 'name', { writable: false });
Em seguida, vamos examinar mais alguns requisitos para alterar o comportamento padrão de um objeto JavaScript.
- Impedir que um objeto tenha uma nova propriedade
- Além do requisito 1, marque todas as propriedades configuráveis como false
- Além do requisito 2, torne todas as propriedades graváveis em false
A partir do ECMA 6, você tem métodos para atender aos requisitos acima. Vamos tomá-los um por um:
Object.preventExtensions
Digamos que você tenha um objeto – gato:
var cat = { name: 'foo', age: 9 }
Com o comportamento padrão, você pode adicionar propriedades a um objeto JavaScript. Assim, a operação abaixo é possível:
cat.color = 'black'; console.log(cat.color); // black
Para evitar que o comportamento padrão adicione propriedades dinamicamente em um objeto, você precisa usar Object.preventExtensions(). Esse método impede que um objeto tenha novas propriedades adicionadas a ele.
Object.preventExtensions(cat); cat.color = 'black'; console.log(cat.color); // undefined
Depois de usar Object.preventExtensions no objeto, se você adicionar uma nova cor de propriedade, o JavaScript a ignorará e, como saída, você obterá undefined.
Se o JavaScript estiver no modo estrito, você receberá um erro se adicionar uma nova propriedade a um objeto que não é extensível.
'use strict' var cat = { name: 'foo', age: 9 } Object.preventExtensions(cat); cat.color = 'black'; console.log(cat.color); // error thrown
No modo estrito, você receberá um erro com mensagens muito claras que afirmam: "não é possível adicionar propriedade, o objeto não é extensível"

Para resumir, você deve usar o método object.preventExtensions para impedir que um objeto tenha novas propriedades adicionadas a ele.
Object.seal
Digamos que você queira selar um objeto, o que significa:
- Você não deve ser capaz de adicionar novas propriedades (chamando object.preventExtensions())
- Nenhuma configuração deve ser alterada (definindo propriedades configuráveis como false)
Você pode selar um objeto usando o método object.seal(). Vamos considerar novamente um objeto – gato:
var cat = { name: 'foo', age: 9 }
Você não deseja que novas propriedades sejam adicionadas ao cat e configurável de todas as propriedades deve ser definido como false. Você pode fazer isso usando o método object.seal():
Object.seal(cat); cat.color = 'black'; console.log(cat.color); // undefined console.log(Object.getOwnPropertyDescriptor(cat, 'name'));
Como você tem um objeto lacrado, como saída, você obterá undefined e configurable definido como false.

Para resumir, você deve usar Object.seal() para selar um objeto. Você não poderá adicionar novas propriedades e configurável está definido como false.
Object.freeze
Digamos que você queira congelar um objeto, o que significa:
- Você não deve ser capaz de adicionar novas propriedades, o que significa chamar object.preventExtensions()
- Nenhuma configuração deve ser alterada (configuração configurável de propriedades como false)
- Para todas as propriedades, gravável deve ser definido como false
Você pode congelar um objeto usando o método Object.freeze(). Essencialmente, ele chama o método Object.seal() e define a propriedade gravável como false.
Vamos considerar um objeto – gato:
var cat = { name: 'foo', age: 9 }
Novas propriedades não devem ser adicionadas ao objeto, configurável de todas as propriedades deve ser definido como falso e gravável de propriedades deve ser definido como falso. Você pode fazer isso usando o método object.freeze():
Object.freeze(cat); cat.age = 10; cat.color = 'black'; console.log(cat.age); //9 console.log(cat.color); // undefined console.log(Object.getOwnPropertyDescriptor(cat, 'name'));
Como você congelou o objeto, como saída, você obterá undefined, 9 e configurable e gravável definido como false.

Para resumir, você deve usar Object.freeze() para congelar um objeto. Depois de congelar um objeto, você não poderá adicionar novas propriedades ou reescrever o valor de uma propriedade, e configurable será definido como false.
Resumo
Ao trabalhar com objetos em JavaScript, você precisa de uma forte compreensão das diferentes maneiras de criar um objeto. O descritor de propriedade, Object.seal, Object.preventExtensions e Object.freeze são muito necessários. Espero que agora você tenha uma melhor compreensão desses conceitos.