最近学习了一下ES标准,发现其实有很多直接间接的方法实现一个只读变量,这里总结一下。

1.最直接的是利用对象属性的特性来实现:

 var obj = {pro1:1};

 Object.defineProperty(obj, "pro1",{writable: false});

 obj.pro1 = 2;

 console.log(obj.pro1);//控制台显示1

  通过使用Object.defineProperty()函数将obj对象的pro1属性修改为不可写,这样,通过对象的属性形式实现了只读变量。

2.使用对象属性的访问器特性

 var obj = {pro1:1};

 Object.defineProperty(obj,"pro1",{
get:function(){
return 1;
},
set:function(newValue){
this.pro1 = 1
}
}); obj.pro1 = 2; console.log(obj.pro1);//显示1

  这里是通过使用Object.defineProperty()设置obj中pro1的访问器属性,无论是给pro1属性设置什么值,pro1的值会设置成1,无论pro1的值是什么也只会返回1。其实感觉只用设置get特性就可以了。

3.“冻结”对象

 var obj = {a:1};

 Object.freeze(obj);

 obj.pro1 = 2;

 console.log(obj.pro1);//显示1

  这里更厉害了,属性特性什么的完全不管,直接将整个对象“冻结”。Object.freeze()函数在标准中的描述是“Prevents the modification of existing property attributes and values, and prevents the addition of new properties.”。即:阻止修改对象中现有属性的值和特性,并阻止添加新属性。这样,整个对象都成了只读的了,对象里面无论有多少属性,统统都变成只读的了。

4.闭包

  前面用了一些看上去很炫酷的方法,提升一下B格,其实要说实现只读,用的最多的当属我大闭包了。

  

 var cache = (function(){
var a = 1; return function(){
return a;
} })(); console.log(cache());

  这里用了闭包的缓存功能,将匿名函数中的a变量缓存起来,间接实现了只读的功能。

如何创建javascript只读变量的更多相关文章

  1. javascript之变量、作用域、作用域链

    一.变量 javascript的变量是松散类型的,所谓松散类型就是说定义的变量可以用来保存任何类型的数据.定义变量时要使用var操作符后面跟变量名.这里的var是一个关键字,如果定义变量时省略了var ...

  2. javaScript的变量

    1.声明 用 var 或 let 声明的未赋初值的变量,值会被设定为undefined(译注:即未定义值,本身也是一个值) 试图访问一个未初始化的变量会导致一个 ReferenceError 异常被抛 ...

  3. javascript中变量提升的理解

    网上找了两个经典的例子 var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); // 10 var ...

  4. javascript的变量作用域--对比js、php和c的for循环

    为什么要写这篇文章呢?主要是给自己提个醒,js的水很深,需要小心点儿才能趟过去,更何况自己不是专业人士,那就得更加小心了. 看下面的js代码: <!DOCTYPE html> <ht ...

  5. JavaScript笔记:变量及其作用域

    一.变量的定义及声明 在javascript中变量仅仅是用来保存值的一个占位符而已,定义变量时要使用关键字var后跟一个变量名,如下所示: var message; //定义一个变量message,像 ...

  6. JavaScript 中变量、作用域和内存问题的学习

    这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...

  7. Javascript的变量与delete操作符

    原文:http://charlee.li/javascript-variables-and-delete-operator.html 刚刚看到一篇好文(原文链接), 对Javascript中的dele ...

  8. .net学习之类与对象、new关键字、构造函数、常量和只读变量、枚举、结构、垃圾回收、静态成员、静态类等

    1.类与对象的关系类是对一类事务的统称,是抽象的,不能拿来直接使用,比如汽车,没有具体指哪一辆汽车对象是一个具体存在的,看的见,摸得着的,可以拿来直接使用,比如我家的那辆刚刚买的新汽车,就是具体的对象 ...

  9. 转 创建 JavaScript XML 文档注释

    http://www.cnblogs.com/chenxizhang/archive/2009/07/12/1522058.html 如何:创建 JavaScript XML 文档注释 Visual ...

随机推荐

  1. achartengine andorid图像引擎入门

    最近在帮机械学院开发一个app 用了第三方的图像引擎——achartengine功能还算强大(虽然相比于Html那些第三方图像引擎还是差点不过也够用了) 入门: 参考http://blog.csdn. ...

  2. c# 使用oledb 写入导出excel设置单元格为成数字格式 设置了不起作用

    使用oledb 导出过程中,如果excel安装版本低于2010,无论怎么设置.导出的都是文本格式. 用代码-使用数据-分列,解决

  3. SERVERPROPERTY方法说明

    SERVERPROPERTY 返回有关服务器实例的属性信息. 语法 SERVERPROPERTY ( propertyname ) 参数 propertyname 是包含要返回的服务器属性信息的表达式 ...

  4. HDU 1070 - Milk

    给每种牛奶价格和量 要求买最便宜的牛奶 #include <iostream> using namespace std; int t,n; ][]; ],v[]; int main() { ...

  5. linux学习笔记之文件类型,及目录介绍

    引用A:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/20/3033131.html 引用B:http://www.cnblogs.c ...

  6. GDAL显示线性shp文件

    http://pan.baidu.com/s/1qWIDphU  (工程文件在vs2008中编写) 1.使用到的技术 GDAL:读取矢量数据 GDI:    绘制矢量数据 2.详细解释 GDI绘图: ...

  7. Java转换

    1.如何将字符串String转化为整数int  int i = Integer.parseInt(str);   int i = Integer.valueOf(my_str).intValue(); ...

  8. js Array 学习

    摘抄自<JavaScript权威指南> 1.join()返回生成的字符串.数组元素转化为字符串,拼接.默认分隔符:“,”. 2.reverse()返回逆序的数组,替换.数组中的元素倒序. ...

  9. 【ecos学习3】redboot on vmware 网络配置

    需要图形化编译的时候必须 Build->Packages 加入:Common ethernet support 才可以有网络功能 导入vmare需要修改网络连接模式: 1- 设置redbootI ...

  10. python运维开发(八)----面向对象(下)

    内容目录: 面向对象三大特性之多态性 面向对象中的成员:字段.方法.属性 类的成员修饰符 类的特殊成员 特殊成员方法 面向对象其他 异常处理 设计模式之单例模式 面向对象的多态性 多态性:即指多种形态 ...