Object.seal()

by 3 contributors:

概要

オブジェクトを封印して、新しいオブジェクトを追加することやすべての既存のプロパティを設定変更不可にすることを抑制します。現存するプロパティの値は、書き込み可能である限り変更できます。

構文

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 に基づきます。

関連情報

ドキュメントのタグと貢献者

Contributors to this page: teoli, ethertank, yyss
最終更新者: teoli,