Object.defineProperties() メソッドは、オブジェクトに直接新しいプロパティを定義し、あるいは既存のプロパティを変更して、そのオブジェクトを返します。
このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 https://github.com/mdn/interactive-examples をクローンしてプルリクエストを送信してください。
構文
Object.defineProperties(obj, props)
引数
obj- プロパティを定義または変更するオブジェクト。
props- 定義または変更するプロパティを構成する、列挙可能なプロパティ記述子のオブジェクト。プロパティに存在するプロパティ記述子には、主にデータ記述子とアクセサ記述子の 2 種類があります (詳細は
Object.defineProperty()を見てください)。プロパティには、つぎに掲げるオプションのキーがあります。
返値
関数に渡されたオブジェクト。
解説
本質的に 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 Latest Draft (ECMA-262) Object.defineProperties の定義 |
ドラフト | |
| ECMAScript 2015 (6th Edition, ECMA-262) Object.defineProperties の定義 |
標準 | |
| ECMAScript 5.1 (ECMA-262) Object.defineProperties の定義 |
標準 | 初回定義。 JavaScript 1.8.5 で実装。 |
ブラウザーの対応
このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、 https://github.com/mdn/browser-compat-data をチェックアウトしてプルリクエストを送信してください。
Update compatibility data on GitHub
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
defineProperties | Chrome 完全対応 5 | Edge 完全対応 12 | Firefox 完全対応 4 | IE 完全対応 9 | Opera 完全対応 11.6 | Safari 完全対応 5 | WebView Android 完全対応 あり | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 12 | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 あり | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応