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。
戻り値
関数に渡されたオブジェクト。
説明
本質的に 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 | (有) |