概要
オブジェクトを封印して、新しいオブジェクトを追加することやすべての既存のプロパティを設定変更不可にすることを抑制します。現存するプロパティの値は、書き込み可能である限り変更できます。
構文
Object.seal(obj)
引数
- obj
- 封印するオブジェクト
説明
既定の状態で、オブジェクトは 拡張可能 (新しいプロパティを追加できます) です。オブジェクトを封印することで、新しいオブジェクトの追加やすべての既存のプロパティを設定変更不可にすることを抑制します。これは、オブジェクトにあるプロパティ一式を固定かつ不変にする効果があります。プロパティを設定変更不可にすることで、データプロパティからアクセサプロパティへの変換やその逆を抑制しますが、データプロパティの値の変更は抑制しません。封印されたオブジェクトでプロパティの削除や追加、あるいはデータプロパティからアクセサプロパティへの変換およびその逆を試みると、暗黙的あるいは TypeError
エラーを発生させて (もっとも一般的には strict mode において、ただしこれに限定はされません) 失敗します。
プロトタイプチェインには手をつけず、そのままにします。ただし、__proto__ ( ) プロパティは同様に封印されます。
例
var obj = { prop: function () {}, foo: "bar" }; // 新しいプロパティは追加でき、既存のプロパティは変更や削除ができます obj.foo = "baz"; obj.lumpy = "woof"; delete obj.prop; var o = Object.seal(obj); assert(o === obj); assert(Object.isSealed(obj) === true); // 封印されたオブジェクトで、プロパティの値の変更は依然としてできます obj.foo = "quux"; // しかし、データプロパティからアクセサプロパティの変換やその逆はできません Object.defineProperty(obj, "foo", { get: function() { return "g"; } }); // TypeError が発生 // プロパティの値の変更を除き、あらゆる変更が失敗します obj.quaxxor = "the friendly duck"; // 暗黙的にプロパティは追加されません delete obj.foo; // 暗黙的にプロパティは削除されません // また、strict モードではこれらの試みに対して TypeErrors が発生します function fail() { "use strict"; delete obj.foo; // TypeError が発生 obj.sparky = "arf"; // TypeError が発生 } fail(); // Object.defineProperty を用いて追加しようとしてもエラーが発生します Object.defineProperty(obj, "ohai", { value: 17 }); // TypeError が発生 Object.defineProperty(obj, "foo", { value: "eit" }); // TypeError が発生
ブラウザ実装状況
機能 | Firefox (Gecko) | Chrome | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本サポート | 4 (2.0) | 6 | 9 | 未サポート | 5.1 |
機能 | Firefox Mobile (Gecko) | Android | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
基本サポート | ? | ? | ? | ? | ? |
Kangax's compat table に基づきます。