最近学习了一下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变量缓存起来,间接实现了只读的功能。