Javascript设置对象属性为只读
有时为了保护某些属性,让其⽆法被更改,我们会把他们设置为常量。
在某些语⾔⾥⾯,也许会⽤const来实现这样的功能。本⽂讲述如何在Javascript中实现这样的功能。alert怎么读
⽅法⼀:
var myObject = {
get readOnlyProperty() { return 1024; }
};
adOnlyProperty); // 1024
adOnlyProperty); // 1024
如果你已经定义好了⼀个Object,那么你可以这么做
var myObject = {};
myObject.__defineGetter__("readOnlyProperty", function() { return 1024; });
上⾯的这两段代码兼容Firefox,Opera 9.5+, Safari 3+和Chrom,不过杯具的是,这些代码是不兼容IE的。
⽅法⼆:
对于⽀持ECMAScript 5的Javascript解释器,你可以使⽤Object.defineProperty⽅法来实现这样的功能。
在松散模式,Javascript解释器会直接忽略掉属性的写⼊。在严格模式(strict mode)下,解释器会抛出⼀个错误。
var obj = {};
Object.defineProperty( obj, "<;属性名>", {
value: "<;属性值>",
writable: false,
enumerable: true,
configurable: true
});
不过很明显,这代码是⽆法在那些不⽀持ECMAScript 5的浏览器(当然包括IE)上执⾏的。
⽅法三:
使⽤模块模式去模拟出这样的功能,不废话,直接看代码
var CONFIG = (function() {
var private = {
'MY_CONST': '1',
'ANOTHER_CONST': '2'
};
return {
get: function(name) { return private[name]; } //函数返回⼀个对象,有get⽅法,接收name参数,返回内部私有变量的值
};
})();
('MY_CONST'));  // 1
CONFIG.MY_CONST = '2';
('MY_CONST'));  // 1
CONFIG.private.MY_CONST = '2';                // 错误,没有private属性
('MY_CONST'));  // 1
这个⽅法兼容⽬前全部浏览器(包括IE),只是读属性的时候需要使⽤get。
⽅法四:
在⼤部分情况下,你并不需要完全控制变量不可写。在业内有个约定,就是使⽤全⼤写的字母来表⽰常量(只读变量)。这是最简单,最好的⽅法。
var MY_CONSTANT = "some-value";
这样写,来告诉⾃⼰,这个变量不可以改变!!!
⽅法五:  “冻结”对象
1 var obj = {a:1};
2
3 Object.freeze(obj);
4
5 obj.pro1 = 2;
6
7 console.log(obj.pro1);//显⽰1
  这⾥更厉害了,属性特性什么的完全不管,直接将整个对象“冻结”。Object.freeze()函数在标准中的描述是“Prevents the modification of existing property attributes and values, and prevents the addition of new properties.”。即:阻⽌修改对象中现有属性的值和特性,并阻⽌添加新属性。这样,整个对象都成了只读的了,对象⾥⾯⽆论有多少属性,统统都变成只读的了。
⽅法六:. 闭包
  前⾯⽤了⼀些看上去很炫酷的⽅法,提升⼀下B格,其实要说实现只读,⽤的最多的当属我⼤闭包了。
1 var cache = (function(){
2    var a = 1;
3
4    return function(){
5        return a;
6    }
7
8 })();
9
10 console.log(cache());
  这⾥⽤了闭包的缓存功能,将匿名函数中的a变量缓存起来,间接实现了只读的功能。