Object.defineProperties()

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

構文

Object.defineProperties(obj, props)

引数

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

戻り値

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

説明

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

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

Polyfill

すべての名前とプロパティが自身の初期値を参照する基本的な実行環境において、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 = !!obj.enumerable;
    if (hasProperty(desc, "configurable"))
      d.configurable = !!obj.configurable;
    if (hasProperty(desc, "value"))
      d.value = obj.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 2017 Draft (ECMA-262)
Object.defineProperties の定義
ドラフト  

ブラウザの互換性

機能 Firefox (Gecko) Chrome Internet Explorer Opera Safari
基本サポート 4.0 (2) 5 9 11.60 5
td>4.0 (2)
機能 Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
基本サポート 4.0 (2) (有) ? 11.5 (有)

参考情報

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

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