Abd*_*UMI 57 javascript locking freeze
Object.freeze
或者相反的是Object.seal
什么?是否有一个具有诸如分离之类的名称的功能?
Cod*_*gue 82
没有办法做到这一点,一旦一个物体被冻结,就无法解冻它.
冻结物体是锁定的最终形式.一旦物体被冻结,它就不会被解冻 - 也不会以任何方式被篡改.这是确保您的对象无限期地保持与您离开它们的最佳方式
Ash*_*mar 14
我认为你可以做一些技巧:
代码在这里:
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
Run Code Online (Sandbox Code Playgroud)
注意:记住一件事,不要做tempObj = obj
,然后它将无法工作,因为tempObj
它也冻结在那里.
这里小提琴:http://jsfiddle.net/mpSYu/
Abd*_*UMI 11
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;
}
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)
Ven*_*ryx 10
您无法解冻冻结的对象。
但是,您可以通过将 Object.freeze 方法覆盖为无操作来使讨厌的库在将来无法冻结任何内容:
Object.freeze = function(obj) { return obj; }; // just return the original object
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,这就足够了。只需在加载库之前运行上面的代码,它就不能再冻结任何东西了。; )
编辑:某些库(例如immer@7.0.7
)有问题,除非在调用后Object.isFrozen(obj)
返回。true
Object.freeze(obj)
因此,下面是一种更安全的阻止对象冻结的方法:(原语检查是因为WeakSet
如果您传入原语会出错)
const fakeFrozenObjects = new WeakSet();
function isPrimitive(val) {
return val == null || (typeof val != "object" && typeof val != "function");
}
Object.freeze = obj=>{
if (!isPrimitive(obj)) fakeFrozenObjects.add(obj);
return obj;
};
Object.isFrozen = obj=>{
if (isPrimitive(obj)) return true;
return fakeFrozenObjects.has(obj);
};
Run Code Online (Sandbox Code Playgroud)
您无法解冻(解冻)一个对象,但如果该对象只是基元的集合(没有函数或类),您可以像这样获得该对象的解冻克隆:
const unfrozenObj = JSON.parse(JSON.stringify(frozenObj));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23759 次 |
最近记录: |