JavaScrip关于创建常量的知识点


Posted in Javascript onDecember 07, 2017

本文通过JS中创建常量的定义用法以及函数写法中常见的错误进行深入分析,希望对大家有所用处:

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

js并没有原始的常量说法(即自定义的,原生态的),但是可以用一些偏僻的路子去创建。

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

JavaScrip关于创建常量的知识点

上面声明了两个变量,当执行修改操作时就将报错。从某种程度上来说,const是可以创建变量(基本类型)的。但是对引用类型就捉襟见肘。

JavaScrip关于创建常量的知识点

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

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

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

JavaScrip关于创建常量的知识点

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

JavaScrip关于创建常量的知识点

JavaScrip关于创建常量的知识点

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

JavaScrip关于创建常量的知识点

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

但是,新的风暴有出现了。。。a虽然定下来了,但对于TEST_D这个变量来说,还没有结束。。。

JavaScrip关于创建常量的知识点

虽然属性a不能变动了,但是并不影响对其他属性的操作,比如b,s,u啊的,当然针对这些属性也可以像上述方式一样将其余属性的描述符,但是还是不能解决对TEST_D的扩展。

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

JavaScrip关于创建常量的知识点

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

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

JavaScrip关于创建常量的知识点

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

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

Object.freeze方法是在seal基础上在将所有属性的描述符writable改为false。

JavaScrip关于创建常量的知识点

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

JavaScrip关于创建常量的知识点

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

JavaScrip关于创建常量的知识点

/**
 * 
 * 
 * @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这个变量‘保护'起来,并且提供访问的接口,但是不提供修改的接口。

Javascript 相关文章推荐
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
Jun 02 Javascript
iframe 上下滚动条如何默认在下方实现原理
Dec 10 Javascript
js动态创建、删除表格示例代码
Aug 07 Javascript
js日期相关函数总结分享
Oct 15 Javascript
js判断设备是否为PC并调整图片大小
Feb 12 Javascript
JS控制一个DIV层在指定时间内消失的方法
Feb 17 Javascript
javascript/jquery获取地址栏url参数的方法
Mar 05 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
javascript将浮点数转换成整数的三个方法
Jun 23 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
Jan 05 Javascript
使用JavaScript进行表单校验功能
Aug 01 Javascript
ionic+html5+API实现双击返回键退出应用
Sep 17 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 #Javascript
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 #Javascript
jQuery实现简单的下拉菜单导航功能示例
Dec 07 #jQuery
vue中路由参数传递可能会遇到的坑
Dec 07 #Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
Dec 07 #Javascript
面包屑导航详解
Dec 07 #Javascript
谈谈JS中的!!
Dec 07 #Javascript
You might like
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
json数据的列循环示例
2013/09/06 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
基于python实现高速视频传输程序
2019/05/05 Python
python如何调用字典的key
2020/05/25 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
绩效专员岗位职责
2013/12/02 职场文书
正科级干部考察材料
2014/05/29 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
教师节学生演讲稿
2014/09/03 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
实习证明格式范文
2014/10/14 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS