Object.defineProperties() メソッドは、オブジェクトに直接新しいプロパティを定義し、あるいは既存のプロパティを変更して、そのオブジェクトを返します。

構文

Object.defineProperties(obj, props)

引数

obj
プロパティを定義または変更するオブジェクト。
props
定義または変更するプロパティを構成する、列挙可能なプロパティ記述子のオブジェクト。プロパティに存在するプロパティ記述子には、主にデータ記述子とアクセサ記述子の 2 種類があります (詳細は Object.defineProperty() を見てください)。プロパティには、つぎに掲げるオプションのキーがあります。
configurable
プロパティの記述子が変更でき、プロパティが対応するオブジェクトから削除できるときのみtrue
既定値は false
enumerable
対応するオブジェクトのプロパティを列挙したとき表示される場合のみ true
既定値は false
value
プロパティに関連づける値。 JavaScript で有効な任意の値です (数値、オブジェクト、関数など)。
既定値は undefined
writable
プロパティに関連づけられた値が代入演算子で変更できる場合のみ true
既定値は false
get
プロパティのゲッターとして用いられる関数。ゲッターがなければ undefined になります。関数の返値がプロパティの値として使用されます。
既定値は undefined
set
プロパティのセッターとして用いられる関数。セッターがなければ undefined になります。関数はただひとつの引数として、プロパティに代入された新たな値を受取ります。
既定値は undefined

返値

関数に渡されたオブジェクト。

解説

本質的に Object.defineProperties は、オブジェクト obj の列挙可能な自身の props のプロパティに対応する、すべてのプロパティを定義します。

var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
  // etc. etc.
});

ポリフィル

すべての名前とプロパティが自身の初期値を参照する基本的な実行環境において、 Object.defineProperties は以下の JavaScript による再実装とほぼ同等です(isCallable のコメントに注意)。

function defineProperties(obj, properties) {
  function convertToDescriptor(desc) {
    function hasProperty(obj, prop) {
      return Object.prototype.hasOwnProperty.call(obj, prop);
    }

    function isCallable(v) {
      // 注意: 関数以外の値が呼び出し可能である場合、必要に応じて変更。
      return typeof v === 'function';
    }

    if (typeof desc !== 'object' || desc === null)
      throw new TypeError('bad desc');

    var d = {};

    if (hasProperty(desc, 'enumerable'))
      d.enumerable = !!desc.enumerable;
    if (hasProperty(desc, 'configurable'))
      d.configurable = !!desc.configurable;
    if (hasProperty(desc, 'value'))
      d.value = desc.value;
    if (hasProperty(desc, 'writable'))
      d.writable = !!desc.writable;
    if (hasProperty(desc, 'get')) {
      var g = desc.get;

      if (!isCallable(g) && typeof g !== 'undefined')
        throw new TypeError('bad get');
      d.get = g;
    }
    if (hasProperty(desc, 'set')) {
      var s = desc.set;
      if (!isCallable(s) && typeof s !== 'undefined')
        throw new TypeError('bad set');
      d.set = s;
    }

    if (('get' in d || 'set' in d) && ('value' in d || 'writable' in d))
      throw new TypeError('identity-confused descriptor');

    return d;
  }

  if (typeof obj !== 'object' || obj === null)
    throw new TypeError('bad obj');

  properties = Object(properties);

  var keys = Object.keys(properties);
  var descs = [];

  for (var i = 0; i < keys.length; i++)
    descs.push([keys[i], convertToDescriptor(properties[keys[i]])]);

  for (var i = 0; i < descs.length; i++)
    Object.defineProperty(obj, descs[i][0], descs[i][1]);

  return obj;
}

仕様書

仕様書 状態 備考
ECMAScript 5.1 (ECMA-262)
Object.defineProperties の定義
標準 初回定義。 JavaScript 1.8.5 で実装。
ECMAScript 2015 (6th Edition, ECMA-262)
Object.defineProperties の定義
標準  
ECMAScript Latest Draft (ECMA-262)
Object.defineProperties の定義
ドラフト  

ブラウザーの対応

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 5Edge 完全対応 ありFirefox 完全対応 4IE 完全対応 9Opera 完全対応 11.6Safari 完全対応 5WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 11.5Safari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり

凡例

完全対応  
完全対応

関連情報

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

このページの貢献者: mfuji09, woodmix, YuichiNukiyama, FumioNonaka, teoli, ethertank, yyss
最終更新者: mfuji09,