【发布时间】:2017-12-26 23:08:12
【问题描述】:
在babel-preset-stage-0中,我们可以声明静态类变量如下:
class Constants {
static COUNTRY = Object.freeze({
NAME: 'Germany',
DESCRIPTION: 'placeholder',
})
}
使用 Constants.COUNTRY 作为 ES6 Map 或 Set 的密钥是否安全?
例如。
const map = new Map();
map.add(Constants.COUNTRY, something);
是否保证map.get(Constants.COUNTRY) 将始终返回something?
性能是否与使用字符串作为键一样好?将Constants.COUNTRY 用作eventKey(引导组件属性)用于NavItem 是否安全?
将其声明为变量而不是类是否也更合适? 即
const Constants = Object.freeze({
COUNTRY: Object.freeze({
NAME: 'Germany',
DESCRIPTION: 'placeholder',
})
})
【问题讨论】:
-
只有当
Constants.COUNTRY的值永远不会改变并且没有人从地图中删除该键时,才能保证始终返回您的数据。静态类只是一个变量,与您的Constants变量替代品没有什么不同。 -
Object.freeze防止Constants.COUNTRY以任何方式被修改,但可以为静态类变量重新分配它......所以我想后一个版本将它声明为常量 Object 是比将它声明为一个类更好。 -
Object.freeze()防止更改对象(这对地图无关紧要,因为它仍然是同一个对象)。Object.freeze()不会阻止Constants.COUNTRY = "hello",这在访问map.get(Constants.COUNTRY)时很重要。 -
是的,刚刚注意到;鉴于此,将其声明为 const 对象比作为类更安全...
-
是的,您的第二个表单(使用
const)将防止Constants.Country被更改。我想知道您是否可以在第一个示例中使用Object.freeze(Constants)。
标签: javascript ecmascript-6 babeljs ecmascript-next