JavaScriptメソッドfreeze
およびseal
について聞いたばかりです。これらのメソッドは、Objectを不変にするために使用できます。
使用方法の簡単な例を次に示します。
var o1 = {}, o2 = {};
Object.freeze(o2);
o1["a"] = "worked";
o2["a"] = "worked";
alert(o1["a"]); //prints "worked"
alert(o2["a"]); //prints "undefined"
freeze
とseal
の違いは何ですか?パフォーマンスを向上できますか?
delete
を使用するとfalseが返されますwritable
属性を変更でき、value
がtrueの場合はwriteable
属性を変更できます。TypeError
をスローできます(最も一般的にはstrictモード)Object.seal
が正確に行うこと、さらに:どちらも「深い」/孫オブジェクトには影響しません。たとえば、obj
が凍結されている場合、obj.el
は再割り当てできませんが、obj.el
の値は変更できます。 obj.el.id
は変更できます。
オブジェクトを封印または凍結すると、ブラウザによっては列挙速度に影響する場合があります。
テスト: シールされたオブジェクト 、 凍結されたオブジェクト 。
私は テストプロジェクト を書いて、これらの3つの方法を比較しました:
Object.freeze()
Object.seal()
Object.preventExtensions()
私の単体テストはCRUDケースをカバーしています:
結果:
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());
}
もう少し遅れるかもしれませんが、
false
に設定されます。 Sealed writableのように、属性はtrue
に設定され、残りの属性はfalseです。オブジェクト全体をフリーズする代わりに、単一のオブジェクトプロパティを強制的にフリーズできるようになりました。これは、Object.defineProperty
をパラメーターとしてwritable: false
を使用して実現できます。
var obj = {
"first": 1,
"second": 2,
"third": 3
};
Object.defineProperty(obj, "first", {
writable: false,
value: 99
});
この例では、obj.first
の値が99にロックされています。