JavaScript中的Object.freeze或Object.seal的对面
什么是Object.freeze
或Object.seal
的相反? 有没有一个名称,如分离的function?
没有办法做到这一点,一旦一个对象被冻结,就没有办法解冻它。
资源
冻结一个物体是locking的最终forms。 一旦物体被冻结,它就不能被解冻,也不能以任何方式被篡改。 这是最好的方法来确保您的对象将保持完全一样,因为你无限期地离开他们
我想你可以用一些技巧来做:
- 首先创build一个原始对象的重复临时variables
- 然后将原始variables设置为undefined
- 从临时值重置它的值。
代码在这里:
var obj = {a : 5}; console.log(obj); // {a: 5} Object.freeze(obj); obj.b = 10; // trying to add something to obj var console.log(obj); // output: {a: 5} -> means its frozen // Now use this trick var tempObj = {}; for(var i in obj){ tempObj[i] = obj[i]; } console.log(tempObj); // {a: 5} // Resetting obj var obj = tempObj; console.log(obj);// {a: 5} obj.b = 10; // trying to add something to obj var console.log(obj); // output: {a: 5, b: 10} -> means it's not frozen anymore
注意:记住一件事,不要做tempObj = obj
,那么tempObj
也会被冻结。
小提琴在这里: http : //jsfiddle.net/mpSYu/
有线解决scheme:)
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; }
最佳实践:
var obj={a:1,b:2} // {a:1,b:2} obj.c=3; //{a:1,b:2,c:3} Object.freeze(obj) //{a:1,b:2,c:3} obj.d=5; //Error: Read only object obj=Object.unfreeze(obj) //{a:1,b:2,c:3} obj.d=5; //{a:1,b:2,c:3,d:5}
var tab=[1,2,3] //[1,2,3] tab.push(4) //[1,2,3,4] Object.freeze(tab); //[1,2,3,4] tab.push(5) // Error : Ready only object tab=Object.unfreeze(tab); //[1,2,3,4] tab.push(9) //[1,2,3,4,9]
您无法解冻冻结的物体。
但是,你可以通过重写Object.freeze方法使其成为一个无操作的方式来使它变得如此烦人的库不能在将来冻结任何东西:
Object.freeze = function(obj) { return obj; }; // just return the original object
在大多数情况下,这就够了。 在载入库之前,只需运行上面的代码,它不能再冻结任何东西。 ; )
testing在FF 52:
至于冻结对象的(符号)“父对象”(它象征性地被引用,旁边/除了代码中对同一对象的其他部分的其他符号引用)不是冷冻的(像窗口),可以尽pipe如此,删除操作符删除它,如:
删除window.tinymce;
即使window.tinymce被Object.freeze(window.tinymce)冻结了。 (否则“父”会成为某种“冻结”本身,因为包含一个不可破坏的对象引用,这将使得NOT-frozen parent的符号不可删除…)
只要有删除/删除之前已经创build的原始对象的拷贝/克隆/重build/自己的版本/删除/没有/原始限制(冻结,可扩展性,可configuration性,可写性等),人们可以把这个复制/克隆/重构/自己的版本/引用给原始的符号地方,就像这样:
window.tinymce = the_copy_clone_reconstruction_own_version_object;
确保在全局范围内具有“copy_clone_reconstruction_own_version_object”,以便您的解决方法代码完成后不会被丢弃! [实际上,这个对象本身应该被删除/它的内存被释放/只是当它的最后一个引用已经被从任何作用域中删除时 – 在一段时间之后,由于垃圾回收,但是我不确定优先级高于“function完成 – 下降所有本地增值税”]
未经testing:其他符号参考可能会指向原始的冻结/限制对象 – 此外,就像是被设定为的东西
myobj.subobj = window.tinymce;
你的行动开始之前。
像这样的东西(myobj.subobj)可能会(试一试!)还指向冻结的原始(?)。
下一个概念:未经testing!
那么如何使用“代理”function来封装冻结/密封或其他限制(扩展性,…)对象的value-get / -set和其他行为(函数,…)呢? 在GLOBAL范围创build,如p = new Proxy(target,handler); 或window.p =新代理(目标,处理程序);
//目标是要拦截/挂接/监视的对象,比如“window.tinymce”
代理主题的mdn-doc指出,封装对象的限制(冻结,…)会被保留,但这可能是指核心/原始对象本身(由代理包装),并可能最终不是指代理所做的模仿…
范围规则可能适用于上面提到的…
- 如何使用drawInRect:withAttributes:而不是drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:in iOS 7
- 执行任务之前android gradle构build?