.seal()

オブジェクトを封印(seal)し、追加による新しいプロパティと、既存のプロパティを設定不可(non-configurable)として印付けします。 プロパティの値は、それらが書き込み可(writable)であれば、依然として変更することが可能です。

文法

Object.seal(obj)
引数 説明
obj 封印(seal)するオブジェクトを指定します。

デフォルトでは、オブジェクトは拡張可能です(新しいプロパティを追加することが出来ます)。 オブジェクトを封印することは、既存のプロパティ全てを設定不可(non-configurable)であると印付けすることで、 新しいプロパティを追加を防ぎます。 これは印付けされたオブジェクトのプロパティが、定着し、不変であるという効果をもたらします。

全てのプロパティを拡張不可(non-configurable)にすることは、 データプロパティをアクセスプロパティに変換することも防ぎ、その逆も然りです。 ただし、データプロパティの値を変更することは防ぎいません。 封印(seal)されたオブジェクトへのプロパティの追加・削除、またはデータプロパティからアクセサプロパティへの変更・その逆、 を試みるとそれは失敗し、沈黙的に処理されるか、またはTypeErrorがスロー(一般的にはstrictモードの場合)されます。

プロトタイプチェーンは、元のままです。 ただし、__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; // throws a TypeError
  obj.sparky = "arf"; // throws a TypeError
}
fail();

// Object.definePropertyを介した拡張の試みも、エラーをスローします。
Object.defineProperty(obj, "ohai", { value: 17 });   // TypeErrorをスロー
Object.defineProperty(obj, "foo", { value: "eit" }); // 既存のプロパティ値を変更

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本 6 4.0 (2.0) 9 × 5.1
モバイル
機能 Android Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本 ? ? ? ? ?

Based on Kangax's compat table.

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。