浅谈在ES5环境下实现const

最近看到一个面试题——用ES5实现const。作为JS初学者的笔者知道在ES6中有const命令,可以用来声明常量,一旦声明,常量的值就不可改变。例如:

1234567891011
const Pi = 3.1415;Pi Pi = 3;// TypeError: Assignment to constant variable.

const foo = {};// 为 foo 添加一个属性,可以成功foo.prop = 123;foo.prop // 123// 将 foo 指向另一个对象,就会报错foo = {}; // TypeError: "foo" is read-only

但是让我困惑的是,怎么才能使用ES5来实现const呢?说到这里我就想起了下半年···中美合拍···两开花···啊不对!!是想起了最近在学习Vue框架,而Vue在实现响应式原理时使用到了Object.defineProperty()方法,该方法可以定义对象属性的数据描述符,比如configurable、writable、enumerable等等,通过这些描述符就可以设置对象属性是否可读可写可配置可枚举,进而就可以实现类似定义常量的功能。

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。语法如下:

Object.defineProperty(obj, prop, descriptor)

其中descriptor代表将被定义或修改的属性描述符。属性描述符有两种主要形式:数据描述符存取描述符。本文只讨论数据描述符,数据描述符有以下选项:

  • configurable

    当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false

  • enumerable

    当且仅当该属性的enumerabletrue时,该属性才能够出现在对象的枚举属性中。默认为 false

  • value

    该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined

  • writable

    当且仅当该属性的writabletrue时,value才能被赋值运算符改变。默认为 false

此时我们设想,当我们讲对象属性中的writable设为false的时候,该属性是只读的,就能满足我们对常量的要求了。

123456789
var _const = {};Object.defineProperty(_const, "A", {	value: 1,    writable: false, //设置属性只读    configurable: true,    enumerable: true});console.log(_const.A);  //1_const.A = 2; //在严格模式下会抛错,在非严格模式下静默失败,修改无效。

但此时,我们只要修改属性的数据描述符来修改属性值,依然可以对属性值进行修改:

1234567891011121314151617
var _const = {};
Object.defineProperty(_const, "A", {
value: 1,
writable: false,
configurable: true,
enumerable: true
});

Object.defineProperty(_const, "A", {
value: 2,
writable: true,
configurable: true,
enumerable: true
});
console.log(_const.A); 大专栏  浅谈在ES5环境下实现constspan class="comment">//2

时间: 2024-10-18 13:40:32

浅谈在ES5环境下实现const的相关文章

【Vue】浅谈Vue不同场景下组件间的数据交流

浅谈Vue不同场景下组件间的数据“交流” Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完文档许多遍后,写起代码还是不免感到有许多困惑,因为我们不知道其中一些知识点的运用场景.这就是我写这篇文章的目的,探讨不同场景下组件间的数据“交流”的Vue实现 父子组件间的数据交流 父子组件间的数据交流可分为两种: 1.父组件传递数据给子组件 2.子组件传递数据给父组件 父组件传递数据给子组件——pro

【VMware虚拟化解决方案】浅议VMware虚拟化环境下的安全策略

浅议VMware虚拟化环境下的安全策略 刘志勇 通过多年的发展,VMware在虚拟化市场处于领军地位,很多企业部署了VMware虚拟化方案,笔者所在的企业同样也不例外. 经过多年来的信息化建设,出于对安全防护的高度重视,为了物理边界和终端安全,企业部署了安全系统,包含了安全网关.应用防护.防病毒软件等等. 但是,企业在信息化建设大量应用了VMware虚拟化的方案,虽然早先做到了物理边界和终端安全,但虚拟化系统的主机漏洞防护却面临着挑战,本文作者就尝试阐述在VMware虚拟化环境下如何制定安全策略

浅谈线程池(下):相关试验及注意事项

三个月,整整三个月了,我忽然发现我还有三个月前的一个小系列的文章没有结束,我还欠一个试验!线程池是.NET中的重要组件,几乎所有的异步功能依赖于线程池.之前我们讨论了线程池的作用.独立线程池的存在意义,以及对CLR线程池和IO线程池进行了一定说明.不过这些说明可能有些"抽象",于是我们还是要通过试验来"验证"这些说明.此外,我认为针对某个"猜想"来设计一些试验进行验证是非常重要的能力,如果您这方面的能力略有不足的话,还是尽量加以锻炼并提高吧. C

浅谈JS执行环境及作用域

 今天刚刚开通博客,也是第一次写博文,略感紧张.作为一个表达能力弱弱的人来说,自己花三分钟理解一个知识点,当别人问起时,也许需要30分钟才只是让别人知道自己在说什么,一点也不夸张,希望在博客上可以练习对语言的组织能力并记录学习笔记与大家一起交流. 进入正题>> 首先,相关的概念定义如下: 1. 执行环境: 所有 JavaScript 代码都是在一个执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生存期等方面的处理,它定义了变量或函数有权访问的其他数

浅谈.net jenkins svn下自动化集成环境安装 搭建 配置

本人做.net研发已有3年多了,之前一直偏向于技术研究,自己学了很多技术,现在突然发现学了那么多技术有什么用呢?真正用到的并不多. 现在?算是一只小鸟吧,自嘲下.....毕竟我是90后,很多领导对于90后这个词没有信任感,相信很多小伙伴都有这样的体会.所以在开发中,我能用到的实力只有20%左右,都是写平时写的想吐的代码(很多公司的架构烂到透,他们追求的不是技术而是业务),偶尔给出点建议,还被唾弃.呵呵..... jenkins就是其中一例,目前新版本测试阶段,一天打包N次,每次测试让打包,我就觉

浅谈优化程序性能(下)

前言 在上一篇随笔中,我们谈到最小化一个计算中的操作数量不一定会提高它的性能.现在,就让我们来解开为什么会出现这种情况的原因吧. 处理器体系结构 在计算机的处理器中,处理一条指令包括很多操作,可以分为取指(fetch).译码(decode).执行(execute).访存(memory).写回(write back)和更新程序计数器(PC update)等几个阶段.这些阶段可以在流水线上同时进行,如下图所示: 上图中,F.D.E.M 和 W 分别代表上述五个阶段.当然,现代的处理器比这个示例要复杂

浅谈Android市场环境,不加密的APP必死

我的题目有点夺人眼球,也当然有喷喷不平者觉得我是危言耸听,那就好好听听我说的是不是有那么一丁点道理. 标题中的APP请排除那些只想靠APP推送广告的小众开发者,诚然这些开发者的出发点并不高,只是想靠Android平台简单易上手的APP开发挣两个小广告钱(当然也包括我自己),他们目标并不是开发出一款高质量.饱含创意.凝结心血的APP,如果一款APP是由那些满腔热血.热心创业并凝结无数心血的创业团队.公司或者个人开发出来的,那我可以很负责的告诉你如果你的APP不加密那只有三种结局: 第一种结局:尽管

浅谈Nginx(二)—http下server配置

此文介绍Nginx下的http模块,着重介绍http模块下的server服务 --------依据"马哥教育"主讲人马永亮导师的上课笔记整理------- 目录  一. http相关的基本配置:     1) listen                2) server_name           3) tcp_nodelay     4) sendfile      二. 定义路径相关的配置:     1)root path     2)location     3)alias 

浅谈export 以及环境变量

简要说一下env,set,export的区别:env命令显示环境变量,set和export显示环境变量和自定变量. export:可以讲自定变量转化为环境变量之前有一个疑惑,我们定义环境变量PATH时习惯性的前面加一个export ,但是后来我测试不加export直接定义环境变量也会在export里面存在,经过查看资料研究才发现,系统的环境变量具有继承性,设置环境变量时不加export也会继承下去,但是自定变量就不一样了.必须前面加上export(或者declare -x  变量名)才具有继承性