maj*_*aja 146 javascript ecmascript-5
我刚刚听说的JavaScript方法freeze
和seal
,可以用来进行任何对象不变.
这是一个如何使用它的简短示例:
var o1 = {}, o2 = {};
Object.freeze(o2);
o1["a"] = "worked";
o2["a"] = "worked";
alert(o1["a"]); //prints "worked"
alert(o2["a"]); //prints "undefined"
Run Code Online (Sandbox Code Playgroud)
这些方法有什么区别,它们能提高性能吗?
Nic*_*ngo 179
delete
将返回falsewritable
属性,以及他们的value
属性if writeable
是真的).TypeError
在尝试修改密封对象本身的值时可以抛出(最常见的是在严格模式下)Object.seal
,再加上:两者都不会影响"深"/孙子对象.例如,如果obj
被冻结,obj.el
则不能重新分配,但obj.el
可以修改值,例如obj.el.id
可以更改.
密封或冻结对象可能会影响其枚举速度,具体取决于浏览器:
Shw*_*har 18
我创建了一个简单的表格来比较以下函数并解释这些函数之间的差异。
Object.freeze()
Object.seal()
Object.preventExtensions()
Object.freeze()
创建一个冻结对象,这意味着它接受一个现有对象并基本上调用Object.seal()
它,但它也将所有"数据访问器"属性标记为writable:false
,以便它们的值不能更改. - 凯尔辛普森,你不知道JS - 这和对象的原型
我正在查看 ECMAScript 5 中 Freeze 和 Seal 之间的差异,并创建了一个脚本来阐明差异。Frozen 创建了一个不可变的对象,包括数据和结构。Seal 防止对命名接口进行更改 - 不添加、删除 - 但您可以改变对象并重新定义其接口的含义。
function run()
{
var myObject = function()
{
this.test = "testing";
}
//***************************SETUP****************************
var frozenObj = new myObject();
var sealedObj = new myObject();
var allFrozen = Object.freeze(frozenObj);
var allSealed = Object.seal(sealedObj);
alert("frozenObj of myObject type now frozen - Property test= " + frozenObj.test);
alert("sealedObj of myObject type now frozen - Property test= " + sealedObj.test);
//***************************FROZEN****************************
frozenObj.addedProperty = "added Property"; //ignores add
alert("Frozen addedProperty= " + frozenObj.addedProperty);
delete frozenObj.test; //ignores delete
alert("Frozen so deleted property still exists= " + frozenObj.test);
frozenObj.test = "Howdy"; //ignores update
alert("Frozen ignores update to value= " + frozenObj.test);
frozenObj.test = function() { return "function"; } //ignores
alert("Frozen so ignores redefinition of value= " + frozenObj.test);
alert("Is frozen " + Object.isFrozen(frozenObj));
alert("Is sealed " + Object.isSealed(frozenObj));
alert("Is extensible " + Object.isExtensible(frozenObj));
alert("Cannot unfreeze");
alert("result of freeze same as the original object: " + (frozenObj === allFrozen).toString());
alert("Date.now = " + Date.now());
//***************************SEALED****************************
sealedObj.addedProperty = "added Property"; //ignores add
alert("Sealed addedProperty= " + sealedObj.addedProperty);
sealedObj.test = "Howdy"; //allows update
alert("Sealed allows update to value unlike frozen= " + sealedObj.test);
sealedObj.test = function() { return "function"; } //allows
alert("Sealed allows redefinition of value unlike frozen= " + sealedObj.test);
delete sealedObj.test; //ignores delete
alert("Sealed so deleted property still exists= " + sealedObj.test);
alert("Is frozen " + Object.isFrozen(sealedObj));
alert("Is sealed " + Object.isSealed(sealedObj));
alert("Is extensible " + Object.isExtensible(sealedObj));
alert("Cannot unseal");
alert("result of seal same as the original object: " + (sealedObj === allSealed).toString());
alert("Date.now = " + Date.now());
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31661 次 |
最近记录: |