JavaScript 常量定义

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

通过   es5实现const
这个问题来查找百度

var obj = {};
obj.a = 1;
obj.b = 2;

//等价于
var obj = {
    a: 1,
    b: 2
}

//等价于
var obj = {};
Object.defineProperty(obj, "a", {
    value: 1,              //初始值
    writable: true,        //可写
    configurable: true,    //可配置
    enumerable: true       //可枚举
});
Object.defineProperty(obj, "b", {
    value: 2,              //初始值
    writable: true,        //可写
    configurable: true,    //可配置
    enumerable: true       //可枚举
});

Object.defineProperty(),该方法是ES5规范中的,该方法的作用是在对象上定义一个新属性,或者修改对象的一个现有属性,并对该属性加以描述,返回这个对象,我们来看一下浏览器兼容性:

特性 Firefox (Gecko) Chrome Internet Explorer Opera Safari
基本支持 4.0 (2) 5 9 [1] 11.60 5.1 [2]

 天煞的IE8

 

 

Object.defineProperty() 方法可以定义对象属性的数据描述和存储描述

configurable

当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,也能够被删除。默认为 false

enumerable

当且仅当该属性的 enumerable 为 true 时,该属性才能够出现在对象的枚举属性中。默认为 false。

value

该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined

writable

当且仅当该属性的 writable 为 true 时,该属性才能被赋值运算符改变。默认为 false

用常规方法定义属性的时候,其除 value 以外的数据描述符默认均为 true ,当我们用 Object.defineProperty() 定义属性的时候,默认为 false。

所以定义常量可以是

var CONST = {};
Object.defineProperty(CONST, "A", {
    value: 1,
    enumerable: true
});
Object.defineProperty(CONST, "B", {
    value: 2,
    enumerable: true
});

 

对象常量

Object.preventExtensions() 方法可以让一个对象不可扩展,该对象无法再添加新的属性,但是可以删除现有属性:

var CONST = {};
CONST.A = 1;
CONST.B = 2;
Object.preventExtensions(CONST);
delete CONST.B;
console.log(CONST);  //CONST: { A: 1}
CONST.C = 3;  //错误!对象不可扩展

Object.seal() 来对一个对象密封,该方法会阻止对象扩展,并将该对象的所有属性设置为不可配置,但是可写:

var CONST = {};
CONST.A = 1;
CONST.B = 2;
Object.seal(CONST);
CONST.A = 3;
console.log(CONST.A);  //3
Object.defineProperty(CONST, "B", {
    value: 2,
    writable: true,       
    configurable: true,  //错误!属性不可配置
    enumerable: false,   //错误!属性不可配置
})    
CONST.C = 3;  //错误!对象不可扩展


Object.seal = function (obj) {
    Object.preventExtensions(obj);
    for (var key in obj) {
        Object.defineProperty(obj, key, {
            value: obj[key],
            writable: true,
            configurable: false,
            enumerable: true
        })
    };
    return obj;
}

两个方法基础上,我们可以 Object.freeze() 来对一个对象进行冻结,实现常量的需求,该方法会阻止对象扩展,并冻结对象,将其所有属性设置为只读和不可配置:

var CONST = {};
CONST.A = 1;
CONST.B = 2;
Object.freeze(CONST);
CONST.A = 3;  //错误!属性只读
Object.defineProperty(CONST, "B", {
    value: 3,            //错误!属性只读
    writable: true,      //错误!属性不可配置
    configurable: true,  //错误!属性不可配置
    enumerable: false,   //错误!属性不可配置
})    
CONST.C = 3;  //错误!对象不可扩展


Object.freeze = function (obj) {
    Object.preventExtensions(obj);
    for (var key in obj) {
        Object.defineProperty(obj, key, {
            value: obj[key],
            writable: false,
            configurable: false,
            enumerable: true
        })
    };
    return obj;
}

 

 

最终

//第一种方法:属性层面,对象可扩展
var CONST = {};
Object.defineProperty(CONST, "A", {
    value: 1,
    enumerable: true
});

//第二种方法:对象层面,对象不可扩展
var CONST = {};
CONST.A = 1;
Object.freeze(CONST);

转载于:https://my.oschina.net/u/2367690/blog/2992569

你可能感兴趣的:(JavaScript 常量定义)