我想在 a 中实现常量class
,因为在代码中定位它们是有意义的。
到目前为止,我一直在使用静态方法实现以下解决方法:
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
我知道有可能摆弄原型,但许多人建议不要这样做。
有没有更好的方法在 ES6 类中实现常量?
我想在 a 中实现常量class
,因为在代码中定位它们是有意义的。
到目前为止,我一直在使用静态方法实现以下解决方法:
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
我知道有可能摆弄原型,但许多人建议不要这样做。
有没有更好的方法在 ES6 类中实现常量?
您可以执行以下操作:
const
从module中导出 a 。根据您的用例,您可以:
export const constant1 = 33;
并在必要时从module中导入它。或者,基于您的静态方法想法,您可以声明一个static
get 访问器:
const constant1 = 33,
constant2 = 2;
class Example {
static get constant1() {
return constant1;
}
static get constant2() {
return constant2;
}
}
这样,您就不需要括号:
const one = Example.constant1;
然后,正如你所说,由于 aclass
只是一个函数的语法糖,你可以像这样添加一个不可写的属性:
class Example {
}
Object.defineProperty(Example, 'constant1', {
value: 33,
writable : false,
enumerable : true,
configurable : false
});
Example.constant1; // 33
Example.constant1 = 15; // TypeError
如果我们可以做这样的事情可能会很好:
class Example {
static const constant1 = 33;
}
但不幸的是,此类属性语法仅在 ES7 提案中,即使如此,它也不允许添加const
到属性中。
class Whatever {
static get MyConst() { return 10; }
}
let a = Whatever.MyConst;
似乎对我有用。
我正在使用babel
并且以下语法对我有用:
class MyClass {
static constant1 = 33;
static constant2 = {
case1: 1,
case2: 2,
};
// ...
}
MyClass.constant1 === 33
MyClass.constant2.case1 === 1
请考虑您需要预设"stage-0"
。
要安装它:
npm install --save-dev babel-preset-stage-0
// in .babelrc
{
"presets": ["stage-0"]
}
更新:
目前使用 stage-3
在这份文件中,它指出:
(有意)没有直接的声明方式来定义原型数据属性(方法除外)类属性或实例属性
这意味着它是故意这样的。
也许您可以在构造函数中定义一个变量?
constructor(){
this.key = value
}
也可以Object.freeze
在您的类(es6)/构造函数(es5)对象上使用以使其不可变:
class MyConstants {}
MyConstants.staticValue = 3;
MyConstants.staticMethod = function() {
return 4;
}
Object.freeze(MyConstants);
// after the freeze, any attempts of altering the MyConstants class will have no result
// (either trying to alter, add or delete a property)
MyConstants.staticValue === 3; // true
MyConstants.staticValue = 55; // will have no effect
MyConstants.staticValue === 3; // true
MyConstants.otherStaticValue = "other" // will have no effect
MyConstants.otherStaticValue === undefined // true
delete MyConstants.staticMethod // false
typeof(MyConstants.staticMethod) === "function" // true
试图改变类会给你一个软失败(不会抛出任何错误,它根本没有效果)。