const foo = {
};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {
}; // TypeError: "foo" is read-only
No código acima, a constante foo armazena um endereço, que aponta para um objeto. Apenas este endereço é imutável, ou seja, foo não pode ser apontado para outro endereço, mas o próprio objeto é mutável, então novos atributos ainda podem ser adicionados a ele.
Abaixo está outro exemplo.
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错
No código acima, a constante a é uma matriz e a própria matriz é gravável, mas se outra matriz for atribuída a a, um erro será relatado.
Se você realmente deseja congelar o objeto, deve usar o método Object.freeze.
const foo = Object.freeze({
});
// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;
No código acima, a constante foo aponta para um objeto congelado, portanto, adicionar novas propriedades não funciona e um erro será relatado no modo estrito.
Além de congelar o próprio objeto, as propriedades do objeto também devem ser congeladas. Abaixo está uma função que congela completamente um objeto.
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key, i) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};