ecmascript:object
目次
Object
Object.create
既存のオブジェクトをプロパティとして新しいオブジェクトを生成する手法。現在ではほぼ使用されていないメソッドだが、プロトタイプのないオブジェクトを作りたい場合に有効。
// p2をプロトタイプにオブジェクトを作成 const p = { greet: function() { console.log(`Hello ${this.name}`) } }; const o1 = Object.create(p); obj.greet(); // Hello obj.name = 'Nyan'; obj.greet(); // Hello Nyan // プロトタイプのないオブジェクトを生成 const o2 = Object.create(null); o2.toString(); // エラー、toStringなど基本的なメソッドも持っていない!
Object.defineProperty / Object.defineProperties
オブジェクトに新しいプロパティを直接定義したり、既存のプロパティを変更したりする。通常のプロパティ定義では設定できないを付与することも可能だが、現在(2025年)ではほぼ使用されていない。
データプロパティの定義
let a = { 'fuga': 'ふが' }; // 戻り値があるが、a自身が変更される。a2 === aである const a2 = Object.defineProperty(a, "hoge", { value: "ほげ" // valueの変更不可(ただしwriatble: trueの場合は変更可能)、削除不可、definePropertyでのさらなる変更不可 configurable: false, // 列挙不可 enumerable: false, // valueの変更不可 writable: false, });
configurable
, writable
, enumerable
の各属性はデフォルトfalse。definePropertyを使わずににプロパティを作った場合はいずれもtrueとなる
アクセサプロパティの定義
いわゆるgetter, setter。valueとwritableを同時に設定できない。
class Hoge { #name; constructor(name) { this.#name = name; } } let a = new Hoge('nyan'); const a2 = Object.defineProperties(a, 'name', { get() { return this.#name }, set(name) { this.#name = name } });
writable属性
falseの場合、値を代入しても変化しない
var a = {}; Object.defineProperty(a, "hoge", { value: "ほげ" }); // 上書きできない! a.hoge = "ふが"; console.log(a.hoge); // => ほげ
enumerable属性
falseの場合
- Object.assignでのコピー対象にならない
- for inで列挙されない
- スプレッド演算子に認識されない
- Object.keysに現れない
- JSON.stringifyで出力されない
configurable属性
falseの場合、
- deleteできない
- 属性を変更できない(ただし、writable: trueの場合、valueを変更したり、writable: falseに変えることは可能)
ecmascript/object.txt · 最終更新: by nullpon