【问题标题】:Javascript object variables constantJavascript 对象变量常量
【发布时间】:2020-07-16 13:43:43
【问题描述】:

是否可以使部分或全部对象变量保持不变?我尝试使用 const 关键字但出现错误。

const testVar = { const x : 777 , y : 888 };

错误:未捕获的语法错误:意外的标识符

【问题讨论】:

标签: javascript


【解决方案1】:

有多种方法可以使对象的属性不可变。下面提到了其中的几个。

使用 Object.freeze() 函数

Object.freeze() 函数防止对象属性被更改。您将无法更改对象的现有属性,也无法添加新属性。

const testVar = { x : 777 , y : 888 };

Object.freeze(testVar);

testVar.x = 2;  

console.log(testVar);

使用 Object.defineProperties() 函数

使用Object.defineProperties() 函数在对象上定义的属性默认为不可写、不可配置且不可枚举。

const testVar = {};

Object.defineProperties(testVar, {
   x: { value: 777, enumerable: true },
   y: { value: 123, enumerable: true }
});

testVar.x = 1;

console.log(testVar);

有关上述功能的详细信息:

【讨论】:

  • freeze ?和这个问题有什么关系?
  • @vsync "Is it possible to make some or all objects variables constant?" 读作“如何使部分或所有对象属性不可变”(或至少不可重新分配)。
  • @vsync:伙计..,你们俩可能都错了.. OP 肯定可以为他/她自己说话。对此大惊小怪是没有用的。如果您认为您的答案/猜测更合适,请将其作为答案发布。
  • 是否可以使部分或全部对象变量保持不变?我不知道为什么每个人都感到困惑。 OP 将 const 关键字放在对象属性之前这一事实仅意味着一件事,那就是 OP 试图使对象属性不可变。
  • 感谢大家的帮助。我认为 freeze() 非常适合我的问题,因为我不希望以后修改对象
【解决方案2】:

您可以使用Object.defineProperty()Object.defineProperties 来设置:

  • writeable 属性描述符到 false 以禁止分配给属性
  • configurable 属性描述符到 false 以禁止删除属性

const testVar = { y : 888 };

Object.defineProperty(testVar, "x", { 
  writeable: false,
  configurable: false,
  enumerable: true, //to show up when printing the object
  value: 777
});

console.log(testVar);

testVar.x = 100;
testVar.y = 200;
console.log(testVar);

delete testVar.x;
delete testVar.y;
console.log(testVar);

这里是一个设置多个属性的例子:

const testVar = { y : 888 };

Object.defineProperties(testVar, {
  x: { 
    writeable: false,
    configurable: false,
    enumerable: true,
    value: 777
  },
  z: { 
    writeable: false,
    configurable: true, // allow deleting
    enumerable: true,
    value: 999
  }
});

console.log(testVar);

testVar.x = 100;
testVar.y = 200;
testVar.z = 300;
console.log(testVar);

delete testVar.x;
delete testVar.y;
delete testVar.z;
console.log(testVar);

【讨论】:

    【解决方案3】:

    const 关键字不会使“深层结构”成为常量。在您的情况下,它只会阻止完全重新分配。

    其他答案正在谈论的Object.freeze() 也不适用于深层结构(或者它会被称为deepFreeze() ?)。

    试试这个:

    const obj = { name: "Joe", job: { title: "Worker" } }
    // Let's freeze it
    Object.freeze(obj)
    
    // This time let's change the job title
    obj.job.title = "Manager"
    
    console.log(obj) // {name: "Joe", job: {title: "Manager"}}
    

    使用let 可以为您提供所需的块范围,并且可以更清楚地理解使用const 路线。

    您需要查看可以为您代理 var 以使其不可变的库(例如 immutable.js https://immutable-js.github.io/immutable-js/)。

    【讨论】:

      【解决方案4】:

      试试这个 - const testVar = { x : 777 , y : 888 };

      Object.freeze(testVar);

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-10-23
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多