Acabei de ouvir falar dos métodos JavaScript freeze
e seal
, que podem ser usados para tornar qualquer objeto imutável.
Aqui está um pequeno exemplo de como usá-lo:
var o1 = {}, o2 = {};
Object.freeze(o2);
o1["a"] = "worked";
o2["a"] = "worked";
alert(o1["a"]); //prints "worked"
alert(o2["a"]); //prints "undefined"
Qual é a diferença entre freeze
e seal
? Eles podem aumentar o desempenho?
javascript
ecmascript-5
maja
fonte
fonte
Object.preventExtensions
além deObject.seal
eObject.freeze
.Object.preventExtensions
apenas impede que novos itens sejam adicionados a um objeto. Você pode excluir, configurar e alterar os valores das propriedades em objetos com a extensibilidade desativadaObject.preventExtensions
.Respostas:
Object.seal
delete
retornará falsowritable
atributo e seusvalue
atributo sewriteable
for verdadeiro).TypeError
ao tentar modificar o valor do próprio objeto selado (geralmente no modo estrito )Object.freeze
Object.seal
faz, mais:Nenhum deles afeta objetos "profundos" / netos. Por exemplo, se
obj
está congelado,obj.el
não pode ser reatribuído, mas o valor deobj.el
pode ser modificado, por exemplo,obj.el.id
pode ser alterado.Atuação:
Selar ou congelar um objeto pode afetar sua velocidade de enumeração, dependendo do navegador:
Testes: Objetos selados , Objetos congelados .
fonte
seal
também torna as propriedades existentes não configuráveis, consulte jsfiddle.net/btipling/6m743whn Número 2, você ainda pode editar, ou seja, alterar os valores das propriedades existentes em um objeto selado.onClick
ouonlick
e se perguntaram por que ele não está funcionando. Se o JavaScript gerar um erro, é menos uma coisa a se enganar. Em segundo lugar, isso permite implementar propriedades constantes em um objeto que impede alterações. Isso é particularmente útil em métodos de objetos.Eu escrevi um projeto de teste que compara esses 3 métodos:
Object.freeze()
Object.seal()
Object.preventExtensions()
Meus testes de unidade abrangem casos CRUD:
Resultado:
fonte
DEBUGMODE
variável e defina-atrue
. Então façaif (DEBUGMODE) { ... }
. No...
, coloque sua funcionalidade para garantir que todos os objetos DOM estejam sempre lacrados. Em seguida, quando estiver pronto para distribuir o script da página da Web, altereDEBUGMODE
parafalse
, execute o script pelo compilador de fechamento e distribua-o. É simples assim.element.onlick=something
e ficam frustrados porque não funciona, mas tecnicamente não é um erro.Você sempre pode procurá-los no MDN. Em resumo:
fonte
Object.seal()
também parece congelar as propriedades do protótipo: \Object.freeze()
cria um objeto congelado, o que significa que ele pega um objeto existente e essencialmente o chamaObject.seal()
, mas também marca todas as propriedades de "acessador de dados" comowritable:false
, para que seus valores não possam ser alterados. - Kyle Simpson, você não conhece JS - Este e protótipos de objetosfonte
Eu estava olhando para as diferenças entre Freeze e Seal no ECMAScript 5 e criei um script para esclarecer as diferenças. Frozen cria um objeto imutável, incluindo dados e estrutura. O selo evita alterações nas interfaces nomeadas - sem acréscimos, exclusões - mas você pode alterar o objeto e redefinir o significado de sua interface.
fonte
Eu sei que posso me atrasar um pouco, mas
false
. onde, como no atributo gravável selado, é definido comotrue
e o restante dos atributos é falso.fonte
Object.getOwnPropertyDescriptor(Object.freeze({ prop: 1 }), 'prop').enumerable
===true
.Agora você pode forçar uma propriedade de um único objeto a ser congelada em vez de congelar o objeto inteiro. Você pode conseguir isso com
Object.defineProperty
withwritable: false
como um parâmetro.Neste exemplo,
obj.first
agora seu valor está bloqueado para 99.fonte
Criei uma tabela simples para comparar as funções abaixo e explicar a diferença entre essas funções.
fonte