Object.preventExtensions() メソッドはすでにプロパティが追加されたオブジェクトで、新しいプロパティを抑制します(すなわち、オブジェクトのさらなる拡張を抑制します)。

構文

Object.preventExtensions(obj)

引数

obj
拡張を不可能にしたいオブジェクトです。

戻り値

拡張不可能にされたオブジェクトです。

説明

新しいプロパティを追加できる場合、オブジェクトは拡張可能です。Object.preventExtensions() はオブジェクトを拡張不可能と標示することで、その時点で持っているプロパティ以外のプロパティを持たせることを不可能にします。拡張不可能なオブジェクトのプロパティは通常、依然として削除できることに注意してください。拡張不可能なオブジェクトへ新たにプロパティを追加しようとしても、暗黙的あるいは TypeError エラーを発生させて失敗します(通常は strict mode において、ただしこれに限定はされません)。

Object.preventExtensions() は、自身のプロパティの追加のみを抑制します。オブジェクトプロトタイプにプロパティを追加することは可能です。

このメソッドは対象の [[prototype]] を不変にし、それ以降のあらゆる [[prototype]] への再代入は TypeError を発生します。この動作は [[prototype]] 内部プロパティ固有のものであり、他のプロパティは変更可能なままです。

拡張可能なオブジェクトを拡張不可能にする方法はありますが、逆の方法はありません。

// Object.preventExtensions は拡張不可能にしたオブジェクトを返します
var obj = {};
var obj2 = Object.preventExtensions(obj);
obj === obj2; // true

// 既定でオブジェクトは拡張可能です
var empty = {};
Object.isExtensible(empty); // true

// この性質は変更できます
Object.preventExtensions(empty);
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';
  // TypeError が発生
  nonExtensible.newProperty = 'FAIL';
}
fail();

拡張不可能なオブジェクトのプロトタイプは不変になります。

var fixed = Object.preventExtensions({});
// TypeError が発生
fixed.__proto__ = { oh: "hai" };

注記

ES5では、このメソッドの引数がオブジェクトではない場合(プリミティブ)、 TypeError が発生します。ES2015 以降では、非オブジェクト引数は、それが拡張不可能な通常のオブジェクトであるかのように扱われ、単にそれを返します。

Object.preventExtensions(1);
// TypeError: 1 is not an object (ES5 code)

Object.preventExtensions(1);
// 1                             (ES2015 code)

仕様

仕様書 策定状況 コメント
ECMAScript 5.1 (ECMA-262)
Object.preventExtensions の定義
標準 初期定義です。JavaScript 1.8.5 で実装されました。
ECMAScript 2015 (6th Edition, ECMA-262)
Object.preventExtensions の定義
標準  
ECMAScript Latest Draft (ECMA-262)
Object.preventExtensions の定義
ドラフト  

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
基本対応Chrome 完全対応 6Edge 完全対応 ありFirefox 完全対応 4IE 完全対応 9Opera 完全対応 12Safari 完全対応 5.1WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり
ES2015 behavior for non-object argumentChrome 完全対応 44Edge ? Firefox 完全対応 35IE 完全対応 11Opera 完全対応 31Safari 完全対応 9WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile ? Firefox Android 完全対応 35Opera Android 完全対応 ありSafari iOS 完全対応 9Samsung Internet Android 完全対応 ありnodejs 完全対応 あり

凡例

完全対応  
完全対応
実装状況不明  
実装状況不明

参考情報

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

このページの貢献者: mdnwebdocs-bot, segayuu, teoli, yyss
最終更新者: mdnwebdocs-bot,