浅谈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返回上一页实例代码通过图片和按钮分别实现
Aug 16 Javascript
javascript中createElement的两种创建方式
May 14 Javascript
JavaScript中for循环的使用详解
Jun 03 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
Aug 27 Javascript
js实现仿爱微网两级导航菜单效果代码
Aug 31 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
Jul 07 Javascript
javascript数组定义的几种方法
Oct 06 Javascript
基于vue-video-player自定义播放器的方法
Mar 21 Javascript
详解vue路由篇(动态路由、路由嵌套)
Jan 27 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
Nov 04 Javascript
微信小程序实现电子签名并导出图片
May 27 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
discuz安全提问算法
2007/06/06 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
php实现aes加密类分享
2014/02/16 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
理解JavaScript中的对象 推荐
2011/01/09 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
python ElementTree 基本读操作示例
2009/04/09 Python
全面解读Python Web开发框架Django
2014/06/30 Python
Python实现批量下载文件
2015/05/17 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
应届生体育教师自荐信
2013/10/03 职场文书
求职自荐信
2013/12/14 职场文书
旅游管理专业个人求职信范文
2013/12/24 职场文书
傅雷家书读书笔记
2015/06/29 职场文书
高老头读书笔记
2015/06/30 职场文书
初中政治教师教学反思
2016/02/23 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS
JS的深浅复制详细
2021/10/16 Javascript