--- title: Object.defineProperties() slug: Web/JavaScript/Reference/Global_Objects/Object/defineProperties tags: - ECMAScript 5 - JavaScript - Method - Object translation_of: Web/JavaScript/Reference/Global_Objects/Object/defineProperties ---
Object.defineProperties()
メソッドは、オブジェクトに直接新しいプロパティを定義し、あるいは既存のプロパティを変更して、そのオブジェクトを返します。
Object.defineProperties(obj, props)
obj
props
props
の各値は、データ記述子かアクセサー記述子のいずれかでなければなりませんが、両方を指定することはできません (詳細は {{jsxref("Object.defineProperty()")}} を参照してください)。configurable
true
。false
。enumerable
true
。false
。データ記述子には以下のオプションのキーもあります。
value
writable
true
。false
。アクセサー記述子には、以下のオプションのキーもあります。
get
set
記述子が value
, writable
, get
set
キーのいずれでもない場合は、データ記述子として扱われます。記述子に value
または writable
と get
または set
キーの両方があった場合は、例外が発生します。
関数に渡されたオブジェクト。
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; }
仕様書 |
---|
{{SpecName('ESDraft', '#sec-object.defineproperties', 'Object.defineProperties')}} |
{{Compat("javascript.builtins.Object.defineProperties")}}