JavaScript定义常数对象属性



我想拥有一个不变的对象字段。我尝试了:

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

字段y被重新分配。
有什么办法可以做这项工作?

使用Object.defineProperty()并将可配置为false。

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

o.y将表现得好像object.freeze被单独调用。

如果要拥有一个简单的对象,则可以使用 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'

另外,如果您需要一堂课,则可以与no-op setter一起使用getter:

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'

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

最新更新