【问题标题】:Javascript - how to declare namespace objects using new conventionsJavascript - 如何使用新约定声明命名空间对象
【发布时间】:2016-12-23 14:31:54
【问题描述】:

我非常喜欢最新的编程约定和最新的编程语言。最近我在Google Guidelines 中看到我们应该使用constlet 而不是var

现在在我的项目中,我有这样的命名空间对象变量(如果这就是它们的名称,如果我错了,请纠正我)

var myObj = {

    func1: {},
    func2: {}
};

var myOtherObj = {

    var1: 'foo',
    var2: 'bar'
};

我现在应该如何使用新的约定命名这些对象,使用constlet?我很困惑,因为我不知道这些大物体是否会随着时间而改变……

【问题讨论】:

  • 将它们更改为const 并运行代码。如果它因为某些东西想要修改变量而中断,要么修复它,要么将其更改为 let
  • 问题是我不太明白像这样的大对象改变意味着什么,如果它是一个简单的局部变量,那么很容易看出它是否被改变了
  • const 声明不会使 object 不可变;它使 变量 不可变。
  • 不要使用命名空间对象;使用 ES6 模块。
  • @Gothdo 那是什么,我为什么要使用它?

标签: javascript ecmascript-6 conventions


【解决方案1】:

const 不会阻止对象的变化(否则它不会freeze 他们)。它可以防止变量的值发生变化。

例如你仍然可以这样做

const myObj = {

    func1: {},
    func2: {}
};

然后

myObj.fun3 = function(){...

你不能用 const 声明的变量(但这似乎不是你的意愿)是

myObj = {};

模块通常用const 声明。

【讨论】:

    【解决方案2】:

    我尝试遵循的一般规则是:const 尽可能使用,let 当你不能使用constvar 从不。

    在您的示例中,当您定义对象(或在其他情况下为数组等)时,我倾向于使用let 来定义对象,以明确表明变量引用可能会改变 里面的内容。

    const 不会阻止列表中对象或元素的属性被更改,所以如果你不确定这是否会发生,我认为最好使用let。它更清晰,可以防止以后出现混乱。

    【讨论】:

    • 如果在我的示例中 myOtherObj.var1 在运行时多次更改值怎么办?如果 myOtherObj 被声明为 const 会起作用吗?
    • 是的,这仍然有效,但它在语义上令人困惑。就像我说的,const 不会阻止对象属性或列表元素被更改,它只是阻止变量引用的分配。因此,在您的情况下,如果对象 myOtherObj 的内容可以多次更改,则使用 let 可以清楚地表明您的意图。
    【解决方案3】:

    如果你真的想要一个不能改变值的符号来引用一个同样不可变的对象,你可以这样做:

    const CONSTANT = Object.freeze({
      a: "hello",
      b: "world"
    });
    

    还要记住,旧平台仍然存在,不支持constlet(可能是Object.freeze())。

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 2010-10-27
      • 2013-07-18
      • 1970-01-01
      • 2015-11-11
      • 2018-07-13
      • 2011-03-30
      相关资源
      最近更新 更多