Object.seal()
メソッドは、オブジェクトを封印して、新しいオブジェクトを追加することを抑制し、すべての既存のプロパティを設定変更不可にします。現存するプロパティの値は、書き込み可能である限り変更できます。
このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 https://github.com/mdn/interactive-examples をクローンしてプルリクエストを送信してください。
構文
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); o === obj; // true 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' }); // 既存のプロパティの値を変更
メモ
ES5 では、このメソッドへの引数がオブジェクトではない場合 (プリミティブである場合)、 TypeError
になります。 ES2015 では、オブジェクトではない引数は封印された通常のオブジェクトと同様に扱われ、単純にそれを返します。
Object.seal(1); // TypeError: 1 is not an object (ES5 code) Object.seal(1); // 1 (ES2015 code)
Object.freeze()
との比較
Object.freeze()
によって凍結されたオブジェクトの既存のプロパティは変更不可になります。 Object.seal()
によって封印されたオブジェクトでは、既存のプロパティを変更することができます。
仕様書
仕様書 | 状態 | 備考 |
---|---|---|
ECMAScript 5.1 (ECMA-262) Object.seal の定義 |
標準 | 初回定義。 JavaScript 1.8.5 で実装。 |
ECMAScript 2015 (6th Edition, ECMA-262) Object.seal の定義 |
標準 | |
ECMAScript Latest Draft (ECMA-262) Object.seal の定義 |
ドラフト |
ブラウザーの対応
デスクトップ | モバイル | サーバー | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
基本対応 | Chrome 完全対応 6 | Edge 完全対応 あり | Firefox 完全対応 4 | IE 完全対応 9 | Opera 完全対応 12 | Safari 完全対応 5.1 | WebView Android 完全対応 あり | Chrome Android 完全対応 あり | Edge Mobile 完全対応 あり | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 あり | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応