浅谈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 Undefined,Null类型和NaN值区别
Oct 22 Javascript
js 覆盖和重载 函数
Sep 25 Javascript
js表头排序实现方法
Jan 16 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
JS实现给对象动态添加属性的方法
Jan 05 Javascript
详解Angular.js中$http拦截器的介绍及使用
Jul 04 Javascript
JS FormData上传文件的设置方法
Jul 05 Javascript
node前端模板引擎Jade之标签的基本写法
May 11 Javascript
Vue头像处理方案小结
Jul 26 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
May 13 jQuery
vue实现二级导航栏效果
Oct 19 Javascript
Vue实现背景更换颜色操作
Jul 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
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
Prototype使用指南之selector.js
2007/01/10 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
javascript实现禁止右键和F12查看源代码
2014/12/26 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
多版本Python共存的配置方法
2017/05/22 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
python的pip安装以及使用教程
2018/09/18 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
简单了解django orm中介模型
2019/07/30 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
基于Python绘制个人足迹地图
2020/06/01 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
亚洲领先的设计购物网站:Pinkoi
2020/11/26 全球购物
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
大学自荐信
2013/12/12 职场文书
面包店的创业计划书范文
2014/01/16 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
高中生毕业评语
2014/12/30 职场文书
工程部主管岗位职责
2015/02/12 职场文书
在职证明书模板
2015/06/15 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
vue实现移动端div拖动效果
2022/03/03 Vue.js