文書の過去の版を表示しています。
<markdown> # Object
## Object.create 既存のオブジェクトをプロパティとして新しいオブジェクトを生成する手法。現在ではほぼ使用されていないメソッドだが、プロトタイプのないオブジェクトを作りたい場合に有効。
```javascript 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年)ではほぼ使用されていない。 ### データプロパティの定義 ```javascript 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を同時に設定できない。 ```javascript 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の場合、値を代入しても変化しない
```javascript 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に変えることは可能)
</markdow n>