JavaScript <その他リファレンス メモ> 言語 等CSSHTMLJavaScriptPython ライブラリ・プラットフォームjQuerymicro:bitXamarin ドキュメンテーションDoxygenJSDocMarkdownSHFBXML ドキュメント コメント その他各種資料 子サイト簡易リファレンス・Tips サポート寄付 Object【オブジェクト】 defineProperty・defineProperties【プロパティ定義】 defineProperty【プロパティ定義 (単一)】defineProperties【プロパティ定義 (複数)】propertyIsEnumerable【列挙可能プロパティ 判定】 Object.defineProperty【プロパティ定義 (単一)】Object.defineProperties【プロパティ定義 (複数)】 メモ概要プロパティを定義 (属性指定) プロパティは データプロパティ または アクセサプロパティ のどちらか 指定属性で判別 〔属性の組合せ〕 共通属性以外がない場合、データプロパティ strict モード下記は TypeError 例外 書き込み不可(writable : false) プロパティで値設定 セッター関数未定義(set : undefined) プロパティで値設定 構成変更不可(configurable : false) プロパティを削除(delete) 関連Object.prototype.propertyIsEnumerable【列挙可能プロパティ 判定】 Object.getOwnPropertyDescriptor【プロパティ記述子 取得】 Object.getOwnPropertyDescriptors【全プロパティ記述子 取得】 外部リンクECMA-262 (英語) Object.defineProperty ( O, P, Attributes )ES2024 (15) ES2023 (14) ES2022 (13) Object.defineProperties ( O, Properties )ES2024 (15) ES2023 (14) ES2022 (13) The Object TypeES2024 (15) ES2023 (14) ES2022 (13) Property AttributesES2024 (15) ES2023 (14) ES2022 (13) The Strict Mode of ECMAScriptES2024 (15) ES2023 (14) ES2022 (13) 構文 Object.defineProperty( O, P, Attributes ) 入力のO (オブジェクト) O (Object) オブジェクト P プロパティ名 または Symbol【シンボル】 Attributes (Object) 属性の組合せ TypeError 例外 O (オブジェクト)がオブジェクト以外 Attributes (属性の組合せ)がオブジェクト以外 Attributes (属性の組合せ)のゲッター関数・セッター関数が呼び出し不可 Attributes (属性の組合せ)の組合せが不正 Object.defineProperties( O, Properties ) 入力のO (オブジェクト) O (Object) オブジェクト Properties (Object) プロパティ定義 (以下のオブジェクト) キー: プロパティ名 または Symbol【シンボル】 値: 属性の組合せ TypeError 例外 O (オブジェクト)がオブジェクト以外 属性の組合せのゲッター関数・セッター関数が呼び出し不可 属性の組合せが不正 属性の組合せ(データプロパティのみ または アクセサプロパティのみ が有効)属性デフォルト値データプロパティアクセサプロパティ備考valueundefined●値getundefined●ゲッター関数 (引数:なし)setundefined●セッター関数 (引数:値)writablefalse●書き込みの可否enumerablefalse●●プロパティ列挙の可否configurablefalse●● 構成変更の可否true の場合、下記が可能・プロパティの削除・データプロパティ と アクセサプロパティ の切換・属性変更 (value・writable 以外も) 例:Object.defineProperty【プロパティ定義 (単一)】 const obj = { propA: 'ValuePropA' }; console.log(Object.getOwnPropertyDescriptor(obj, 'propA')); // 出力:Object { value: "ValuePropA", writable: true, enumerable: true, configurable: true } obj.propB = 'ValuePropB'; console.log(Object.getOwnPropertyDescriptor(obj, 'propB')); // 出力:Object { value: "ValuePropB", writable: true, enumerable: true, configurable: true } // デフォルト (データプロパティ) Object.defineProperty(obj, 'propDefault', { value: 'ValueDefault' }); console.log(Object.getOwnPropertyDescriptor(obj, 'propDefault')); // 出力:Object { value: "ValueDefault", writable: false, enumerable: false, configurable: false } obj.propDefault = 'Dummy'; // 値変更 (失敗:エラーなし) console.log(obj.propDefault); // 出力:ValueDefault (function() { 'use strict'; // obj.propDefault = 'Dummy'; // 値変更 (失敗:例外) // TypeError: "propDefault" is read-only }()); console.log(Object.keys(obj)); // 列挙 (対象外) // 出力:Array [ "propA", "propB" ] // Object.defineProperty(obj, 'propDefault', { writable: true }); // 属性変更 (失敗) // TypeError: can't redefine non-configurable property "propDefault" delete obj.propDefault; // 削除 (失敗) console.log(obj.propDefault); // ValueDefault // 書き込み可 (データプロパティ) Object.defineProperty(obj, 'propWritable', { value: 'ValueWritable', writable: true }); console.log(Object.getOwnPropertyDescriptor(obj, 'propWritable')); // 出力:Object { value: "ValueWritable", writable: true, enumerable: false, configurable: false } obj.propWritable = 'ValueWritable_New'; // 値変更 (成功) console.log(obj.propWritable); // 出力:ValueWritable_New console.log(Object.keys(obj)); // 列挙 (対象外) // 出力:Array [ "propA", "propB" ] delete obj.propWritable; // 削除 (失敗:エラーなし) (function() { 'use strict'; // delete obj.propWritable; // 削除 (失敗:例外) // TypeError: property "propWritable" is non-configurable and can't be deleted }()); console.log(obj.propWritable); // 出力:ValueWritable_New // Object.defineProperty(obj, 'propWritable', { enumerable: true }); // 属性変更 (失敗) // TypeError: can't redefine non-configurable property "propWritable" // シンボル・列挙可 (データプロパティ) const symbolEnumerable = Symbol('enumerable'); Object.defineProperty(obj, symbolEnumerable, { value: 'ValueEnumerable', enumerable: true }); console.log(Object.getOwnPropertyDescriptor(obj, symbolEnumerable)); // 出力:Object { value: "ValueEnumerable", writable: false, enumerable: true, configurable: false } obj[symbolEnumerable] = 'Dummy'; // 値変更 (失敗:エラーなし) (function() { 'use strict'; // obj[symbolEnumerable] = 'Dummy'; // 値変更 (失敗:例外) // TypeError: Symbol("enumerable") is read-only }()); console.log(obj[symbolEnumerable]); // 出力:ValueEnumerable console.log(Object.keys(obj)); // 列挙 (対象) // 出力:Array(3) [ "propA", "propB", "propEnumerable" ] delete obj[symbolEnumerable]; // 削除 (失敗:エラーなし) (function() { 'use strict'; // delete obj[symbolEnumerable]; // 削除 (失敗:例外) // TypeError: property Symbol("enumerable") is non-configurable and can't be deleted }()); console.log(obj[symbolEnumerable]); // 出力:ValueEnumerable // Object.defineProperty(obj, symbolEnumerable, { enumerable: false }); // 属性変更 (失敗) // TypeError: can't redefine non-configurable property Symbol("enumerable") // 構成変更可 (データプロパティ) Object.defineProperty(obj, 'propConfigurable', { value: 'ValueConfigurable', configurable: true }); console.log(Object.getOwnPropertyDescriptor(obj, 'propConfigurable')); // 出力:Object { value: "ValueConfigurable", writable: false, enumerable: false, configurable: true } obj.propConfigurable = 'Dummy'; // 値変更 (失敗:エラーなし) (function() { 'use strict'; // obj.propConfigurable = 'Dummy'; // 値変更 (失敗:例外) // TypeError: "propConfigurable" is read-only }()); console.log(obj.propConfigurable); // 出力:ValueConfigurable console.log(Object.keys(obj)); // 列挙 (対象外) // 出力:Array(3) [ "propA", "propB", "propEnumerable" ] Object.defineProperty(obj, 'propConfigurable', { enumerable: true }); // 属性変更 (成功) console.log(Object.getOwnPropertyDescriptor(obj, 'propConfigurable')); // 出力:Object { value: "ValueConfigurable", writable: false, enumerable: true, configurable: true } delete obj.propConfigurable; // 削除 (成功) console.log(obj.propConfigurable); // 出力:undefined // 各種例外 // O (オブジェクト)がオブジェクト以外 // Object.defineProperty(undefined, 'propDummy', { value: 'ValueDummy' }); // TypeError: undefined is not a non-null object // Attributes (属性の組合せ)がオブジェクト以外 // Object.defineProperty(obj, 'propDummy', undefined); // TypeError: Property descriptor must be an object, got undefined // Attributes (属性の組合せ)のゲッター関数・セッター関数が呼び出し不可 // Object.defineProperty(obj, 'propDummy', { get: null}); // TypeError: property descriptor's get field is neither undefined nor a function // Attributes (属性の組合せ)の組合せが不正 // Object.defineProperty(obj, 'propDummy', { value: 'ValueDummy', get: function() {return 'Dummy';}}); // TypeError: property descriptors must not specify a value or be writable when a getter or setter has been specified // ゲッター関数・セッター関数 (アクセサプロパティ) function getAccessorObj(value) { let _value = value; const obj = { }; Object.defineProperty( obj, 'propSetterGetter', { get: function() { return _value + ' (Getter)'; }, set: function(value) { _value = value; } } ); return obj; } const objAcc = getAccessorObj('Value'); console.log(Object.getOwnPropertyDescriptor(objAcc, 'propSetterGetter')); // 出力:Object { get: get(), set: set(value), enumerable: false, configurable: false } console.log(objAcc.propSetterGetter); // 出力:Value (Getter) objAcc.propSetterGetter = 'Value_NEW'; console.log(objAcc.propSetterGetter); // 出力:Value_NEW (Getter) console.log(Object.keys(objAcc)); // 列挙 (対象外) // 出力:Array [] delete objAcc.propSetterGetter; // 削除 (失敗:エラーなし) (function() { 'use strict'; // delete objAcc.propSetterGetter; // 削除 (失敗:例外) // TypeError: property "propSetterGetter" is non-configurable and can't be deleted }()); console.log(objAcc.propSetterGetter); // 出力:Value_NEW (Getter) // Object.defineProperty(objAcc, 'propSetterGetter', { enumerable: true }); // 属性変更 (失敗) // TypeError: can't redefine non-configurable property "propSetterGetter" // ゲッター関数のみ (アクセサプロパティ) Object.defineProperty(objAcc, 'propNonSetter', { get: function() { return '(Getter)'; } }); console.log(Object.getOwnPropertyDescriptor(objAcc, 'propNonSetter')); // 出力:Object { get: get(), set: undefined, enumerable: false, configurable: false } objAcc.propNonSetter = 'Dummy'; // 値変更 (失敗:エラーなし) (function() { 'use strict'; // objAcc.propNonSetter = 'Dummy'; // 値変更 (失敗:例外) // TypeError: setting getter-only property "propNonSetter" }()); console.log(objAcc.propNonSetter); // 出力:(Getter) 例:Object.defineProperties【プロパティ定義 (複数)】 const obj = { }; const symbolWritable = Symbol('Writable'); Object.defineProperties( obj, { 'prop': { value: 'Value' }, symbolWritable: { value: 'ValueWritable', writable: true }, 'propEnumerable': { value: 'ValueEnumerable', enumerable: true }, 'propConfigurable': { value: 'ValueConfigurable', configurable: true }, 'propSetterGetter': { get: function() { return '(Getter)'; }, set: function(value) { }}, } ); console.log(Object.getOwnPropertyDescriptors(obj)); // 出力: // Object { prop: {…}, symbolWritable: {…}, propEnumerable: {…}, propConfigurable: {…}, propSetterGetter: {…} } // prop: Object { value: "Value", writable: false, enumerable: false, … } // configurable: false // enumerable: false // value: "Value" // writable: false // propConfigurable: Object { value: "ValueConfigurable", writable: false, enumerable: false, … } // configurable: true // enumerable: false // value: "ValueConfigurable" // writable: false // propEnumerable: Object { value: "ValueEnumerable", writable: false, enumerable: true, … } // configurable: false // enumerable: true // value: "ValueEnumerable" // writable: false // propSetterGetter: Object { get: get(), enumerable: false, configurable: false, … } // configurable: false // enumerable: false // get: function get() // set: function set(value) // symbolWritable: Object { value: "ValueWritable", writable: true, enumerable: false, … } // configurable: false // enumerable: false // value: "ValueWritable" // writable: true console.log(Object.getOwnPropertyNames(obj)); // 出力:Array(5) [ "prop", "symbolWritable", "propEnumerable", "propConfigurable", "propSetterGetter" ] console.log(Object.keys(obj)); // 出力:Array [ "propEnumerable" ] for (const key in obj) { console.log(key); } // 出力: // propEnumerable Object.prototype.propertyIsEnumerable【列挙可能プロパティ 判定】メモ概要プロパティが列挙可能か判定 関連Object.defineProperty【プロパティ定義 (単一)】 Object.defineProperties【プロパティ定義 (複数)】 外部リンクECMA-262 (英語) Object.prototype.propertyIsEnumerable ( V )ES2024 (15) ES2023 (14) ES2022 (13) 構文 Object.propertyIsEnumerable( V ) プロパティの列挙可能 判定 (true:列挙可 / :false列挙不可) V プロパティ名 例 const obj = { propEnum: 'ValueEnum' }; Object.defineProperty(obj, 'propUnenum', { value: 'ValueUnenum', enumerable: false }); console.log(Object.getOwnPropertyDescriptor(obj, 'propEnum')); // 出力:Object { value: "ValueEnum", writable: true, enumerable: true, configurable: true } console.log(obj.propertyIsEnumerable('propEnum')); // 出力:true console.log(Object.getOwnPropertyDescriptor(obj, 'propUnenum')); // 出力:Object { value: "ValueUnenum", writable: false, enumerable: false, configurable: false } console.log(obj.propertyIsEnumerable('propUnenum')); // 出力:false