Object.defineProperties()

概要

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

構文

Object.defineProperties(obj, props)

引数

obj
プロパティを定義または変更するオブジェクト。
props
定義または変更するプロパティを構成する、列挙可能なプロパティのディスクリプタのオブジェクト。プロパティには、つぎに掲げるオプションのキーがあります。
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)
The definition of 'Object.defineProperties' in that specification.
Standard 初期定義。
JavaScript 1.8.5による実装。
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.defineProperties' in that specification.
Standard  

ブラウザの互換性

機能 Firefox (Gecko) Chrome Internet Explorer Opera Safari
基本サポート 4.0 (2) 5 (前のバージョンではテストされていません) 9 11.60 5
機能 Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
基本サポート 4.0 (2) (有) ? 11.50 (有)

Kangax's compat tables に基づきます。

参考情報

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

Contributors to this page: FumioNonaka, teoli, ethertank, yyss
最終更新者: FumioNonaka,