浅谈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 相关文章推荐
[原创]站长必须要知道的javascript广告代码
May 30 Javascript
JS实现的自定义右键菜单实例二则
Sep 01 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
Jan 14 Javascript
javascript每日必学之基础入门
Feb 16 Javascript
js实现div在页面拖动效果
May 04 Javascript
JavaScript代码性能优化总结篇
May 15 Javascript
js中scrollTop()方法和scroll()方法用法示例
Oct 03 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
JavaScript实现的搜索及高亮显示功能示例
Aug 14 Javascript
javascript实现的字符串转换成数组操作示例
Jun 13 Javascript
基于Layui自定义模块的使用方法详解
Sep 14 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
Aug 07 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
一个高ai的分页函数和一个url函数
2006/10/09 PHP
PHP 设计模式之观察者模式介绍
2012/02/22 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
JS烟花背景效果实现方法
2015/03/03 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
python控制台中实现进度条功能
2015/11/10 Python
Python理解递归的方法总结
2019/01/28 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
挪威手表购物网站:Klokker
2016/09/19 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
基于Python 函数和方法的区别说明
2021/03/24 Python
网站开发实习生的自我评价
2013/12/11 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
我的中国梦主题班会
2015/08/14 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书