Ir para o conteúdo
Selar, congelar e impedir a extensão de um objeto em JavaScript

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

5min read

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:

No console, você pode ver que o nome de uma 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.

  1. Impedir que um objeto tenha uma nova propriedade
  2. Além do requisito 1, marque todas as propriedades configuráveis como false
  3. 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"

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.

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.

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.

Solicite uma demonstração