浅谈JS如何实现真正的对象常量


Posted in Javascript onJune 25, 2017

前言

众所周知ES6新增的const关键字可以用来声明常量,但是它只对基本数据类型生效(Number、String、Boolean等),那如果我们想声明一个常量对象呢?该如何实现,Object内置对象早就替我们想到了,下面来具体看一下

正题

一、先来看一下const方式来声明基本类型常量

代码:

const name = 'jack'
 name = 'lucy'  // 修改name常量

运行结果:

浅谈JS如何实现真正的对象常量

可以看到,控制台报错了,所以基本类型常量一旦声明复制,就不能在被修改

二、再来用const方式来声明复杂类型常量(即对象常量)

代码:

const Obj = {
 name: 'jack'
}

Obj.name = 'lucy' // 修改属性
Obj.age = 23 // 扩展属性
console.log(Obj.name)
console.log(Obj.age)

delete Obj.age
console.log(Obj.age) // 删除属性

Obj = {

 name: 'sam'
}

运行结果:

浅谈JS如何实现真正的对象常量

结果表明:对象常量只是不允许修改引用地址,但是属性还是可以被修改、扩展和删除的

要想得到一个真正的对象常量,我们无非要做的就是以下三点:

1.对象的属性不得被扩展

2.对象的属性不得被删除
3.对象的属性不得被修改

(1) 首先,如何做的对象属性不会被扩展呢?我们可以用Object.preventExtensions方法做到这一点

代码:

var Obj = {
 name: 'jack'
}

Object.preventExtensions(Obj)

Obj.age = 23 // 扩展属性
console.log(Obj.age) // undefined(说明扩展失败了)

运行结果:

浅谈JS如何实现真正的对象常量

(2) 接着,扩展的问题解决了,那如何实现属性不会被删除呢?不必担心,我们有Object.seal方法,该方法不仅可以保证对象的属性不会被扩展,而且还能防止属性被删除

代码:

var Obj = {
 name: 'jack'
}

Object.seal(Obj)

Obj.age = 23 // 扩展属性
console.log(Obj.age) // undefined(说明扩展失败了)

delete Obj.name // 删除属性
console.log(Obj.name) // 'jack'(说明删除失败了)

运行结果:

浅谈JS如何实现真正的对象常量

(3) 扩展和删除的问题都已经得到了解决,就剩下属性不得被修改的问题了,那么我们清楚终极Boss:Object.freeze,它可以做的对象既不可被扩展和删除,而且还不被修改

代码:

var Obj = {
 name: 'jack'
}

Object.freeze(Obj)

Obj.age = 23 // 扩展属性
console.log(Obj.age) // undefined(说明扩展失败了)

delete Obj.name // 删除属性
console.log(Obj.name) // 'jack'(说明删除失败了)

Obj.name = 'lucy' // 修改属性
console.log(Obj.name) // 'jack'(说明修改失败)

运行截图:

浅谈JS如何实现真正的对象常量

/***************************分割线*******************************/

以上就是一步步的演示如何实现一个真正的对象常量,但是有如下两个问题:

1.如果我们调用了这三个方法中的任何一个,然后我们再去做它们所禁止的行为(preventExtensions禁止扩展属性,seal禁止删除属性,freeze禁止修改属性),那么,如果在严格模式下,程序会报错,所以我们要谨慎使用

2.Object.freeze虽然实现了真正的对象常量,但是它的一切操作只在顶级对象属性上生效,下面的代码说明了这一问题

代码:

var Obj = {
 name: 'jack',

 extraInfo: {


 age: 23

 }
}

Object.freeze(Obj)

Obj.extraInfo.age = 80
console.log(Obj.extraInfo.age)
// 80

运行截图:

浅谈JS如何实现真正的对象常量

所以要想真正实现常量对象,我们需要以树的形式把对象的子孙对象都freeze,Object.freeze和递归可以解决该问题

// constantize实现递归freeze
var constantize = (obj) => {
 Object.freeze(obj);

 Object.keys(obj).forEach( (key, i) => {

 
 if ( typeof obj[key] === 'object' ) {

 
 
constantize( obj[key] );


 }

 });
}

var Obj = {

 name: 'jack',

 extraInfo: {

 
 age: 23

 }
}

constantize(Obj)

Obj.extraInfo.age = 80
console.log(Obj.extraInfo.age)  // 23

结语

以上就是常量对象的一些知识点,日常开发中,我们可以引入对象常量这个概念,来配置默认参数对象或一些配置信息,使我们的代码更加严谨

这篇浅谈JS如何实现真正的对象常量就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 单引号 传递方法
Jun 22 Javascript
jquery tools系列 expose 学习
Sep 06 Javascript
JavaScript写的一个自定义弹出式对话框代码
Jan 17 Javascript
使用javascript实现Iframe自适应高度
Dec 24 Javascript
jQuery实现3D文字特效的方法
Mar 10 Javascript
浅谈JavaScript中的string拥有方法的原因
Aug 28 Javascript
jQuery实现的简单拖拽功能示例
Sep 13 Javascript
vue项目中使用ueditor的实例讲解
Mar 05 Javascript
javaScript产生随机数的用法小结
Apr 21 Javascript
详解微信小程序调起键盘性能优化
Jul 24 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
Apr 17 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
Nov 17 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
Jun 25 #Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 #Javascript
jQuery实现拖动效果的实例代码
Jun 25 #jQuery
JS检测window.open打开的窗口是否关闭
Jun 25 #Javascript
jQuery validata插件实现方法
Jun 25 #jQuery
简单谈谈axios中的get,post方法
Jun 25 #Javascript
jQuery鼠标移动图片上实现放大效果
Jun 25 #jQuery
You might like
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
世界经理人咨询有限公司面试
2014/09/23 面试题
Java基础知识面试题
2014/03/25 面试题
文秘专业毕业生就业推荐信
2013/11/08 职场文书
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
前台文员岗位职责
2013/12/28 职场文书
致长跑运动员广播稿
2014/01/31 职场文书
安全教育月活动总结
2014/05/05 职场文书
早读课迟到检讨书
2014/09/25 职场文书
女生抽烟检讨书
2014/10/05 职场文书
西岭雪山导游词
2015/02/06 职场文书
少年犯观后感
2015/06/11 职场文书
个人自我鉴定怎么写?
2019/07/01 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
Oracle表空间与权限的深入讲解
2021/11/17 Oracle
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫