1、javascript 浅冻结
var obj = {prop: function() {},foo: 'bar'
};// 新的属性会被添加, 已存在的属性可能
// 会被修改或移除
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;// 作为参数传递的对象与返回的对象都被冻结
// 所以不必保存返回的对象(因为两个对象全等)
var o = Object.freeze(obj);o === obj; // true
Object.isFrozen(obj); // === true// 现在任何改变都会失效
obj.foo = 'quux'; // 静默地不做任何事
// 静默地不添加此属性
obj.quaxxor = 'the friendly duck';
2、JavaScript 深冻结
function deepFreeze(obj) {// 取回定义在obj上的属性名var propNames = Object.getOwnPropertyNames(obj);// 在冻结自身之前冻结属性propNames.forEach(function(name) {var prop = obj[name];// 如果prop是个对象,冻结它if (typeof prop == 'object' && prop !== null)deepFreeze(prop);});// 冻结自身(no-op if already frozen)return Object.freeze(obj);
}
解冻
在浏览器规范中这个是不可逆的。
但是有一些小技巧可以实现类似的效果
Object.unfreeze=function(o){var oo=undefined;if( o instanceof Array){oo=[];var clone=function(v){oo.push(v)};o.forEach(clone); }else if(o instanceof String){oo=new String(o).toString();}else if(typeof o =='object'){oo={};for (var property in o){oo[property] = o[property];}}return oo;}