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 相关文章推荐
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
Jan 22 Javascript
JavaScript 数组循环引起的思考
Jan 01 Javascript
js自执行函数的几种不同写法的比较
Aug 16 Javascript
用js来刷新当前页面保留参数的具体实现
Dec 23 Javascript
js选择并转移导航菜单示例代码
Aug 19 Javascript
javascript中键盘事件用法实例分析
Jan 30 Javascript
jQuery中extend()和fn.extend()方法详解
Jun 03 Javascript
浅析JavaScript中浏览器的兼容问题
Apr 19 Javascript
js实现登录与注册界面
Nov 01 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
Jul 10 Javascript
深入解析ES6中的promise
Nov 08 Javascript
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 Vue.js
浅谈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
php实例分享之mysql数据备份
2014/05/19 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
深入解析nodejs HTTP服务
2017/07/25 NodeJs
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
介绍一下Python下range()函数的用法
2013/11/07 面试题
法人代表委托书
2014/04/04 职场文书
大学生励志演讲稿
2014/04/25 职场文书
擅自离岗检讨书
2014/09/12 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
如何在CSS中绘制曲线图形及展示动画
2021/05/24 HTML / CSS
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android