js建立常量

所谓常量即只能读取不能编辑(删除,修改)的变量。javascript

js并无原始的常量说法(即自定义的,原生态的),可是能够用一些偏僻的路子去建立。java

1:const es6中的声明关键词。es6

上面声明了两个变量,当执行修改操做时就将报错。从某种程度上来讲,const是能够建立变量(基本类型)的。可是对引用类型就捉襟见肘。闭包

当声明的变量是一个引用类型时即对象,对对象的操做(删除,修改,添加)都是能够进行的。spa

2:Object 方法(defineProperty,seal,freeze)实现3d

 1) Object.defineProperty:   该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。 查看详情code

  

  采用上述方法以后后续对a的修改功能就失效了,虽然修改功能不能正常执行, 可是删除功能却仍是能够照常进行。对象

  

  

  删除以后继续添加a属性时,a又变成可改的了。上述只是将a属性的可写属性改了,还有一个configurable属性能够进行设置。writable属性只是将对应的属性变动为不可直接更改,可是能够走小路(先删除在添加)。blog

  

  到此属性a就算定下来了,及不能修改,也不能删除。接口

  可是,新的风暴有出现了。。。a虽然定下来了,但对于TEST_D这个变量来讲,尚未结束。。。

  

  虽然属性a不能变更了,可是并不影响对其余属性的操做,好比b,s,u啊的,固然针对这些属性也能够像上述方式同样将其他属性的描述符,可是仍是不能解决对TEST_D的扩展。

   2) Object.preventExtensions:  该方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。 查看详情

  

   经过该方法就能够将对象设置为不可扩展了,即不可添加新属性了,这样这个变量就不能被修改了。

 3)Object.seal:让一个对象密封并返回被密封以后的对象,新对象将变得不可扩展,即不能添加新的属性可是能够修改本来可写状态的属性     查看详情

  

  利用上述两种方法循环使用是能够去建立常量的,可是比较复杂,并且当对象比较大的时候,代码量会比较大。Object.seal()能够简化这个过程。这个方法能够将对象变得不可扩展,属性不可删除。在此基础上在将对象的全部属性的描述符writable改成false就能获得咱们要的变量了,即所谓常量。

 4) Object.freeze:  该方法能够冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象。   查看详情

 Object.freeze方法是在seal基础上在将全部属性的描述符writable改成false。

   

    可是当变量的属性值又为对象时,及下列状况:

  

  对于user属性而言,他的值是仍是能够更改的,这个时候就得对他也进行冻结。

  

  

/**
 * 
 * 
 * @param {any} obj 
 */
function freezeObj(obj) {
    Object.freeze(obj);
    Object.keys(obj).forEach(key => {
        if (typeof obj[key] === 'object') {
            freezeObj(obj[key])
        }
    })
}

即:当存在多重对象时,须要循环调用冻结方法。

 3: 闭包

const USER = (() => {
    const USER = {
        name: 'evening',
        gender: 'M'
    }
    return {
        get(name){
            return user[name]
        }
    }
})()
USER.get('name')

闭包用了比较隐秘的方法,将真正的对象原型保存在内存中并且不会被回收,变相的将USER这个变量‘保护’起来,而且提供访问的接口,可是不提供修改的接口。

相关文章
相关标签/搜索