【JSリファレンス】Object.defineProperty()
更新日:2024/06/14
Object.defineProperty()は、Objectコンストラクターのメソッドです。
オブジェクトに書き込み不可などの属性と共に、プロパティの追加や変更を行います。
同様の機能にObject.defineProperties()がありますが、こちらは複数のプロパティを一括で操作できます。
■構文
Object.defineProperty ( O, P, Attributes )
- O: 設定を行うオブジェクト
- P: プロパティ名
- Attributes: プロパティ記述子
■プロパティ記述子について
プロパティ記述子(Property Descriptor)は、プロパティの属性を定義したオブジェクトです。
属性名をプロパティ名として、設定値をプロパティ値としてもつオブジェクトで指定します。
プロパティ記述子は、データプロパティ記述子とアクセサープロパティ記述子の2種類に分類できます。
データプロパティ記述子は一般的なプロパティで、代入操作で値の入出力をおこないます。
アクセサープロパティ記述子も代入操作で値の出し入れをしますが、オリジナルのメソッドで値の保存、および出力を行います。
分類 | 属性名 | 初期値 | 内容 |
---|---|---|---|
データ | value | undefined | プロパティの値(初期値) |
writable | false | 値の変更が可能かどうか。trueなら可能。 | |
アクセサー | get | undefined | 値を返すメソッド(ゲッター関数) 引数なし |
set | undefined | 値をセットする関数(セッター関数) 引数:セットする値 |
データプロパティ記述子とアクセサープロパティ記述子の属性は、混在できません。
また表中の初期値は、Object.defineProperty()およびObject.defineProperties()でプロパティ定義したときの値です。
※Object.defineProperty()を使用せずに通常の方法で定義した場合、writable属性の値はtrueです。
共通の属性として、次の二つの属性を使用できます。
属性名 | 初期値 | 内容 |
---|---|---|
configurable | false | プロパティの削除および、属性の変更が可能かどうか。trueなら可能。 |
enumerable | false | プロパティ列挙可能かどうか。trueなら可能。 |
※Object.defineProperty()を使用せずに通常の方法で定義した場合、二つの属性値はtrueです。
■使用例
▶ データプロパティ記述子
const obj1 = { prop1:100 };
// prop2を追加
Object.defineProperty( obj1 , "prop2" ,
{
value:100,
writable:false , // 初期値のため省略可
enumerable:false , // 初期値のため省略可
});
// enumerable:true のため prop2 が列挙されない
console.log(obj1); // { prop1: 100 }
// writable:true のため prop2は値変更できない
obj1.prop1 = 200;
obj1.prop2 = 200;
console.log(obj1.prop1); // 200
console.log(obj1.prop2); // 100 (strict時はエラー)
▶ アクセサープロパティ記述子
const obj1 = { _value:100 };
Object.defineProperty( obj1 , "value" ,
{
get(){ return this._value * 2; },
set(v){ this._value = v; }
});
console.log( obj1.value ); // 200
obj1.value = 300;
console.log( obj1.value ); // 600
関連ページ
更新日:2024/06/14
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://jsref.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。