ユーザ用ツール

サイト用ツール


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