Quería tener un campo de objeto que sea inmutable. He intentado:

const a = 1;
var o = {
   x: 'This is mutable',
   y: a // This should not be mutable.
};
o.y = 'Changed';
console.log(o);

El campo y se reasigna.
¿Hay alguna manera de hacer funcionar esto?

0
F.Almeida 22 feb. 2018 a las 13:30

3 respuestas

La mejor respuesta

Si desea tener un objeto simple, puede usar Object.defineProperty():

const tea = {};
Object.defineProperty(tea, 'bar', {
  value: 'unchanged',
  writable: false,
  configurable: false
});

console.log(tea.bar); // 'unchanged'
tea.bar = 'new value';
console.log(tea.bar); // 'unchanged'
delete tea.bar;
console.log(tea.bar); // 'unchanged'

Alternativamente, si necesita una clase, puede usa un getter junto con un setter no operativo:

class Foo {
  get bar() {
    return 'unchanged';
  }
  set bar(_) {}
};
const tea = new Foo();

console.log(tea.bar); // 'unchanged'
tea.bar = 'new value';
console.log(tea.bar); // 'unchanged'
delete tea.bar;
console.log(tea.bar); // 'unchanged'
2
Nit 22 feb. 2018 a las 21:18

Usa Object.defineProperty() y configurable como falsa.

var o = {
    x: 'This is mutable'
};
Object.defineProperty(o, "y", { configurable: false, writable: false });

console.log(o);

O.y se comportará como si se llamara a Object.freeze por separado.

3
hashedram 22 feb. 2018 a las 10:46
var obj = {a:1,b:2};

Object.defineProperty(obj,'b',{
    writable:false
});

obj.b = 3;

console.log(obj.b) //output 2
obj.a = 8; 
console.log(obj.a); //output 8
2
vishwajeet singh chauhan 22 feb. 2018 a las 10:44