Object
======

**`Object`** クラスは JavaScript のデータ型の一つを表します。これは様々なキー付きコレクションとより複雑な実態を格納するために使用されます。 Object は `Object()` コンストラクターまたはオブジェクト初期化子/リテラル構文を使用して生成することができます。

解説
--

JavaScript のほぼすべてのオブジェクトが `Object` のインスタンスです。一般的なオブジェクトは、プロパティを (メソッドを含めて) `Object.prototype` から継承していますが、これらのプロパティはシャドウ化 (別名オーバーライド) されている場合があります。しかし、意図的にそうではない `Object` を生成したり (例えば `Object.create(null)` によって)、変更した結果そうではなくなる場合 (例えば `Object.setPrototypeOf`) もあります。

`Object` プロトタイプオブジェクトへの変更は、その変更の対象となるプロパティやメソッドがプロトタイプチェーンに沿ってさらにオーバーライドされない限り、プロトタイプチェーンを通して**すべての**オブジェクトに反映されます。これはとても強力ですが、オブジェクトの動作をオーバーライドしたり拡張したりするのは潜在的に危険をはらむ仕組みでもあります。

`Object` コンストラクターは、指定された値のオブジェクトラッパーを生成します。

* 値が `null` または `undefined` である場合、空のオブジェクトを生成して返します。
* それ以外の場合は、与えられた値に関連する型のオブジェクトを返します。
* 値がすでにオブジェクトであった場合は、その値を返します。

コンストラクター以外のコンテキストで呼び出された場合、 `Object` は `new Object()` と同等に動作します。

オブジェクト初期化子/リテラル構文も参照してください。

### オブジェクトからのプロパティの削除

オブジェクト自体には、自身のプロパティを削除するメソッド (`Map.prototype.delete()` のようなもの) はありません。これを行うには、delete 演算子を使用する必要があります。

コンストラクター
--------

`Object()`

新しい `Object` オブジェクトを生成します。これは指定された値のラッパーです。

静的メソッド
------

`Object.assign()`

1 個以上のソースオブジェクトから、自身の列挙可能なプロパティの値をすべてターゲットオブジェクトにコピーします。

`Object.create()`

指定されたプロトタイプオブジェクトとプロパティから、新しいオブジェクトを生成します。

`Object.defineProperty()`

指定された記述子で記述された名前付きプロパティをオブジェクトへ追加します。

`Object.defineProperties()`

指定された記述子で記述された複数の名前付きプロパティをオブジェクトへ追加します。

`Object.entries()`

指定されたオブジェクト**自身**の列挙可能な文字列プロパティのすべての `[key, value]` の組を含む配列を返します。

`Object.freeze()`

オブジェクトを凍結します。他のコードがプロパティを削除したり変更したりすることができなくなります。

`Object.fromEntries()`

反復可能な `[key, value]` の組から新しいオブジェクトを返します。(これは `Object.entries` の逆です。)

`Object.getOwnPropertyDescriptor()`

オブジェクトの名前付きプロパティに対応するプロパティ記述子を返します。

`Object.getOwnPropertyDescriptors()`

オブジェクト自身のすべてのプロパティの記述子を含むオブジェクトを返します。

`Object.getOwnPropertyNames()`

指定したオブジェクト**自身**の列挙可能および列挙不可なすべてのプロパティの名前を、配列として返します。

`Object.getOwnPropertySymbols()`

指定したオブジェクト上に直接存在するすべてのシンボルプロパティからなる配列を返します。

`Object.getPrototypeOf()`

指定されたオブジェクトのプロトタイプ (内部の `[[Prototype]]` プロパティ) を返します。

`Object.is()`

二つの値が同じ値であるかどうかを比較します。 `NaN` 値はすべて同じものとして扱われます (抽象的等価比較とも厳密等価比較とも異なります)。

`Object.isExtensible()`

オブジェクトの拡張が許可されているかどうかを判定します。

`Object.isFrozen()`

オブジェクトが凍結されているかどうかを判定します。

`Object.isSealed()`

オブジェクトが封印されているかどうかを判定します。

`Object.keys()`

指定されたオブジェクト**自身**の列挙可能なプロパティの名前をすべて含む配列を返します。

`Object.preventExtensions()`

オブジェクトのあらゆる拡張を抑止します。

`Object.seal()`

オブジェクトのプロパティを削除するほかのコードを抑止します。

`Object.setPrototypeOf()`

オブジェクトのプロトタイプ (内部の `[[Prototype]]` プロパティ) を設定します。

`Object.values()`

与えられたオブジェクト**自身**の列挙可能な文字列プロパティすべてに対応する値を含む配列を返します。

インスタンスプロパティ
-----------

`Object.prototype.constructor`

オブジェクトのプロトタイプを生成する関数を指定します。

`Object.prototype.__proto__`

オブジェクトがインスタンス化されたとき、プロトタイプとして使用されたオブジェクトを指します。

インスタンスメソッド
----------

`Object.prototype.__defineGetter__()`

関数をプロパティに関連付けます。そのプロパティにアクセスすると、その関数を実行して返値を返すようにします。

`Object.prototype.__defineSetter__()`

関数をプロパティに関連付け、設定されるとプロパティを変更する関数を実行するようにします。

`Object.prototype.__lookupGetter__()`

`Object.prototype.__defineGetter__()` メソッドによって特定のプロパティに関連付けされた関数を返します。

`Object.prototype.__lookupSetter__()`

`Object.prototype.__defineSetter__()` メソッドによって特定のプロパティに関連付けされた関数を返します。

`Object.prototype.hasOwnProperty()`

オブジェクトが、プロトタイプチェーンを通じて継承されたものではなくオブジェクトの直接のプロパティを持っているかどうかを示す論理値を返します。

`Object.prototype.isPrototypeOf()`

このメソッドが呼び出されたオブジェクトが、指定されたオブジェクトのプロトタイプチェーンにあるかどうかを示す論理値を返します。

`Object.prototype.propertyIsEnumerable()`

内部の ECMAScript [[Enumerable]] 属性が設定されているかどうかを表す論理値を返します。

`Object.prototype.toLocaleString()`

`toString()` を呼び出します。

`Object.prototype.toString()`

そのオブジェクトの文字列表現を返します。

`Object.prototype.valueOf()`

指定されたオブジェクトのプリミティブ値を返します。

例
-

### `undefined` や `null` 型を指定して `Object` を使用

以下の例は、空の `Object` オブジェクトを `o` に格納します。


```js
let o = new Object();
```



```js
let o = new Object(undefined);
```



```js
let o = new Object(null);
```

### `Object` を使用して `Boolean` オブジェクトを生成

以下の例は、 `Boolean` オブジェクトを `o` に格納します。


```js
// o = new Boolean(true) と同じ
let o = new Object(true);
```



```js
// o = new Boolean(false) と同じ
let o = new Object(Boolean());
```

### オブジェクトのプロトタイプ

`Object.prototype` の既存のメソッドの動作を変更するには、既存のロジックの前または後で独自の拡張を囲む形でコードを挿入するようにしてください。例えば、この (テストされていない) コードは、組み込みロジックや誰かの拡張機能が実行される前に、条件付きで独自のロジックを実行します。

関数が呼び出されると、呼び出す引数は配列風の「変数」 arguments に保持されます。例えば `myFn(a, b, c)` の呼び出しでは、`myFn` の本体内での引数は `(a, b, c)` に対応する 3 つのの要素を含みます。

フックを使ってプロトタイプを変更する場合は、関数で `apply()` を呼び出すことで、 `this` と引数 (呼び出し状態) を現在の動作に渡します。このパターンは、`Node.prototype` や `Function.prototype` など、どんなプロトタイプにも使えます。


```js
var current = Object.prototype.valueOf;

// プロパティ "-prop-value" は横断的で、同じプロトタイプチェーン上に
// あるとは限らないので、 Object.prototype を修正したいと思います。
Object.prototype.valueOf = function () {
  if (this.hasOwnProperty("-prop-value")) {
    return this["-prop-value"];
  } else {
    // 私のオブジェクトのようには見えないので、現在の動作をできる限り再現して、
    // 既定の動作にフォールバックします。
    // apply は、他のいくつかの言語における "super" のような動作をします。
    // valueOf() は引数を取りませんが、他のフックによっては取るかもしれません。
    return current.apply(this, arguments);
  }
};
```


正確には JavaScript にはサブクラスのオブジェクトが存在しないので、プロトタイプは下記の例のように、オブジェクトとして動作する特定の関数の「基本クラス」オブジェクトを作るための有用な回避策となります。


```js
var Person = function (name) {
  this.name = name;
  this.canTalk = true;
};

Person.prototype.greet = function () {
  if (this.canTalk) {
    console.log("Hi, I am " + this.name);
  }
};

var Employee = function (name, title) {
  Person.call(this, name);
  this.title = title;
};

Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee; // Object.prototype.constructor を Employee に設定しないと、
// Person (親) の prototype.constructor を取ってしまいます。
//それを避けるために prototype.constructor を Employee (子) に設定しています。

Employee.prototype.greet = function () {
  if (this.canTalk) {
    console.log("Hi, I am " + this.name + ", the " + this.title);
  }
};

var Customer = function (name) {
  Person.call(this, name);
};

Customer.prototype = Object.create(Person.prototype);
Customer.prototype.constructor = Customer; // Object.prototype.constructor を Customer に設定しないと、
// Person (親) の prototype.constructor を取ってしまいます。
//それを避けるために prototype.constructor を Employee (子) に設定しています。

var Mime = function (name) {
  Person.call(this, name);
  this.canTalk = false;
};

Mime.prototype = Object.create(Person.prototype);
Mime.prototype.constructor = Mime; // Object.prototype.constructor を Mime に設定しないと、
// Person (親) の prototype.constructor を取ってしまいます。
//それを避けるために prototype.constructor を Employee (子) に設定しています。

var bob = new Employee("Bob", "Builder");
var joe = new Customer("Joe");
var rg = new Employee("Red Green", "Handyman");
var mike = new Customer("Mike");
var mime = new Mime("Mime");

bob.greet();
// Hi, I am Bob, the Builder

joe.greet();
// Hi, I am Joe

rg.greet();
// Hi, I am Red Green, the Handyman

mike.greet();
// Hi, I am Mike

mime.greet();
```

仕様書
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-object-objects |

ブラウザーの互換性
---------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

関連情報
----

* オブジェクト初期化子