概要
すでにプロパティが追加されたオブジェクトで、新しいプロパティを抑制します (すなわち、オブジェクトのさらなる拡張を抑制します)。
構文
Object.preventExtensions(obj)
引数
- obj
- 拡張を不可能にしたいオブジェクトです。
説明
新しいプロパティを追加できる場合、オブジェクトは拡張可能です。preventExtensions はオブジェクトを拡張不可能と標示することで、その時点で持っているプロパティ以外のプロパティを持たせることを不可能にします。拡張不可能なオブジェクトのプロパティは通常、依然として削除できることに注意してください。拡張不可能なオブジェクトへ新たにプロパティを追加しようとしても、暗黙的あるいは TypeError エラーを発生させて (もっとも一般的には strict mode において、ただしこれに限定はされません) 失敗します。
Object.preventExtensions は、自身のプロパティの追加のみを抑制します。オブジェクトプロトタイプにプロパティを追加することは可能です。ただしオブジェクトで Object.preventExtensions を呼び出すことで、それらの __proto__ ( ) プロパティでの拡張は抑制します。
ECMAScript 5 では拡張可能なオブジェクトを拡張不可能にする方法はありますが、逆の方法はありません。
例
// Object.preventExtensions は拡張不可能にしたオブジェクトを返します
var obj = {};
var obj2 = Object.preventExtensions(obj);
assert(obj === obj2);
// 既定でオブジェクトは拡張可能です
var empty = {};
assert(Object.isExtensible(empty) === true);
// この性質は変更できます
Object.preventExtensions(empty);
assert(Object.isExtensible(empty) === false);
// 拡張不可能なオブジェクトに新しいプロパティを追加する際、Object.defineProperty でエラーが発生します
var nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, "new", { value: 8675309 }); // TypeError が発生
// strict mode では、拡張不可能なオブジェクトに新たなプロパティを追加しようとすると TypeError が発生します
function fail()
{
"use strict";
nonExtensible.newProperty = "FAIL"; // TypeError が発生
}
fail();
// 拡張機能 (__proto__ (これは廃止されました。代わりに Object.getPrototypeOf を用いてください) をサポートするエンジンに限る): 拡張不可能なオブジェクトのプロトタイプは不変になります
var fixed = Object.preventExtensions({});
fixed.__proto__ = { oh: "hai" }; // 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 に基づきます。