我正在设计一些类,并且对于某些数据,我想使用常量字段。
现在,像往常一样,IE不支持关键字const,因此
const T = 10;
无法工作。
我可以通过__defineGetter__
和__defineSetter__
创建属性来模拟,但是,像往常一样,IE不支持该语法(IE 8具有Object.defineProperty
,但无法在自定义对象上使用)。
有什么想法吗?
我正在设计一些类,并且对于某些数据,我想使用常量字段。
现在,像往常一样,IE不支持关键字const,因此
const T = 10;
无法工作。
我可以通过__defineGetter__
和__defineSetter__
创建属性来模拟,但是,像往常一样,IE不支持该语法(IE 8具有Object.defineProperty
,但无法在自定义对象上使用)。
有什么想法吗?
"没有解决方案" 确实是最安全的解决方案。目前,在JavaScript中创建常量没有一个好的机制,但如果您建立一个约定(使用 ALL CAPS FOR CONSTS 来识别它们),并且不要自行覆盖它们,那么您自己的常量将是安全的。
如果您正在编写一个公共库,并且非常担心有人修改某个值,则可以使用仅对您自己的代码可访问的私有变量来控制作用域的函数:
(function() {
var MY_CONSTANT = 42;
alert(MY_CONSTANT); // alerts "42"
...do other stuff in here...
})();
alert(MY_CONSTANT); // alerts "undefined" because MY_CONSTANT is out of scope here
如果开发人员能够在JavaScript中读取一个值,那么该开发人员就可以修改该值。
Javascript中有一个freeze()方法,可用于创建实际常量。
用法:
var consts = {}; // Object to store all constants
consts.MY_CONSTANT= 6;
Object.freeze(consts); // Make the consts truly read only
consts.MY_CONSTANT= 7; // Trying to do this will give error
Object.defineProperty 是您想要的。
例如:
var obj = {};
Object.defineProperty(obj, 'key', {
enumerable: false,
configurable: false,
writable: false,
value: 'static'
});
将"obj.key"定义为"value:static",并使其只读。
本质上,将它们全部设置为false,您正在创建对象的常量。默认情况下它们都是false。
因此,实际上是这样做的:
Object.defineProperty(obj, 'property', { value: 'value'});
将创建一个常数在'obj'上,称为'property',其值为'value'。或者您可以这样做:
function setConstant(obj, key, value)
{
Object.defineProperty(obj, key, {value: value });
}
var obj = {};
setConstant(obj, "constantName", "constantValue");
这将使它更易读。
虽然这是一个老问题,但是如今你可以简单地使用以下方法:
const MY_CONST = 10;
来自MDN:
const 声明创建一个对值的只读引用。 它不意味着该值是不可变的,而是变量标识符不能被重新分配。