1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
|
---
title: Object
slug: Web/JavaScript/Reference/Global_Objects/Object
tags:
- Constructor
- JavaScript
- Object
- コンストラクター
translation_of: Web/JavaScript/Reference/Global_Objects/Object
---
<div>{{JSRef}}</div>
<p><code><strong>Object</strong></code> クラスは <a href="/ja/docs/Web/JavaScript/Data_structures">JavaScript のデータ型</a>の一つを表します。これは様々なキー付きコレクションとより複雑な実態を格納するために使用されます。Object は {{jsxref("Object/Object", "Object()")}} コンストラクターまたは<a href="/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer">オブジェクト初期化子/リテラル構文</a>を使用して生成することができます。</p>
<h2 id="Description" name="Description">解説</h2>
<p>JavaScript のほぼすべてのオブジェクトが {{jsxref("Object")}} のインスタンスです。一般的なオブジェクトは、プロパティを (メソッドを含めて) <code>Object.prototype</code> から継承していますが、これらのプロパティはシャドウ化 (別名オーバーライド) されている場合があります。しかし、意図的にそうではない <code>Object</code> を生成したり (例えば {{jsxref("Object.create", "Object.create(null)")}} によって)、変更した結果そうではなくなる場合 (例えば {{jsxref("Object.setPrototypeOf")}}) もあります。</p>
<p><code>Object</code> プロトタイプオブジェクトへの変更は、その変更の対象となるプロパティやメソッドがプロトタイプチェーンに沿ってさらにオーバーライドされない限り、プロトタイプチェーンを通してすべてのオブジェクトに表示されます。これはとても強力ですが、オブジェクトの動作をオーバーライドしたり拡張したりするのは潜在的に危険をはらむ仕組みでもあります。</p>
<p><code>Object</code> コンストラクターは、指定された値のオブジェクトラッパーを生成します。</p>
<ul>
<li>値が {{jsxref("null")}} または {{jsxref("undefined")}} である場合、空のオブジェクトを生成して返します。</li>
<li>それ以外の場合は、与えられた値に関連する型のオブジェクトを返します。</li>
<li>値がすでにオブジェクトであった場合は、その値を返します。</li>
</ul>
<p>コンストラクター以外のコンテキストで呼び出された場合、<code>Object</code> は <code>new Object()</code> と同等に動作します。</p>
<p><a href="/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer">オブジェクト初期化子/リテラル構文</a>も参照してください。</p>
<h3 id="Deleting_a_property_from_an_object" name="Deleting_a_property_from_an_object">オブジェクトからプロパティを削除する</h3>
<p>オブジェクト自体には、自身のプロパティを削除するメソッドはありません ( {{jsxref("Map.prototype.delete", "Map.prototype.delete()")}}) など)。これを行うには、<a href="/ja/docs/Web/JavaScript/Reference/Operators/delete">delete 演算子</a>を使用する必要があります。</p>
<h2 id="Constructor" name="Constructor">コンストラクター</h2>
<dl>
<dt>{{jsxref("Object/Object", "Object()")}}</dt>
<dd><code>Object</code> コンストラクターは指定された値のオブジェクトラッパーを生成します。</dd>
</dl>
<h2 id="Static_methods" name="Static_methods">静的メソッド</h2>
<dl>
<dt>{{jsxref("Object.assign","Object.assign()")}}</dt>
<dd>1 個以上のソースオブジェクトから、自身の列挙可能なプロパティの値をすべてターゲットオブジェクトにコピーします。</dd>
<dt>{{jsxref("Object.create","Object.create()")}}</dt>
<dd>指定されたプロトタイプオブジェクトとプロパティから、新しいオブジェクトを生成します。</dd>
<dt>{{jsxref("Object.defineProperty","Object.defineProperty()")}}</dt>
<dd>指定された記述子で記述された名前付きプロパティをオブジェクトへ追加します。</dd>
<dt>{{jsxref("Object.defineProperties","Object.defineProperties()")}}</dt>
<dd>指定された記述子で記述された複数の名前付きプロパティをオブジェクトへ追加します。</dd>
<dt>{{jsxref("Object.entries","Object.entries()")}}</dt>
<dd>指定したオブジェクトの<strong>自身の</strong>列挙可能な文字列プロパティのすべての <code>[key, value]</code> ペアを含む配列を返します。</dd>
<dt>{{jsxref("Object.freeze","Object.freeze()")}}</dt>
<dd>オブジェクトを凍結します。他のコードがプロパティを削除したり変更したりすることができなくなります。</dd>
<dt>{{jsxref("Object.fromEntries","Object.fromEntries()")}}</dt>
<dd>反復可能な <code>[key, value]</code> の組から新しいオブジェクトを返します。(これは {{jsxref("Object.entries")}} の逆です。)</dd>
<dt>{{jsxref("Object.getOwnPropertyDescriptor","Object.getOwnPropertyDescriptor()")}}</dt>
<dd>オブジェクトの名前付きプロパティに対応するプロパティ記述子を返します。</dd>
<dt>{{jsxref("Object.getOwnPropertyDescriptors","Object.getOwnPropertyDescriptors()")}}</dt>
<dd>オブジェクトの自身のすべてのプロパティの記述子を含むオブジェクトを返します。</dd>
<dt>{{jsxref("Object.getOwnPropertyNames","Object.getOwnPropertyNames()")}}</dt>
<dd>指定したオブジェクトの<strong>自身の</strong>列挙可能および列挙不可なすべてのプロパティの名前を、配列として返します。</dd>
<dt>{{jsxref("Object.getOwnPropertySymbols","Object.getOwnPropertySymbols()")}}</dt>
<dd>指定したオブジェクト上に直接存在するすべてのシンボルプロパティからなる配列を返します。</dd>
<dt>{{jsxref("Object.getPrototypeOf","Object.getPrototypeOf()")}}</dt>
<dd>指定されたオブジェクトのプロトタイプ (内部の <code>[[Prototype]]</code> プロパティ) を返します。</dd>
<dt>{{jsxref("Object.is","Object.is()")}}</dt>
<dd>二つの値が同じ値であるかどうかを比較します。<code>NaN</code> 値はすべて同じとして扱われます (抽象的等価比較とも厳密等価比較とも異なります)。</dd>
<dt>{{jsxref("Object.isExtensible","Object.isExtensible()")}}</dt>
<dd>オブジェクトの拡張が許可されているかどうかを判定します。</dd>
<dt>{{jsxref("Object.isFrozen","Object.isFrozen()")}}</dt>
<dd>オブジェクトが凍結されているかどうかを判定します。</dd>
<dt>{{jsxref("Object.isSealed","Object.isSealed()")}}</dt>
<dd>オブジェクトが封印されているかどうかを判定します。</dd>
<dt>{{jsxref("Object.keys","Object.keys()")}}</dt>
<dd>指定されたオブジェクト<strong>自身</strong>の列挙可能なプロパティの名前をすべて含む配列を返します。</dd>
<dt>{{jsxref("Object.preventExtensions","Object.preventExtensions()")}}</dt>
<dd>オブジェクトに対するあらゆる拡張を禁止します。</dd>
<dt>{{jsxref("Object.seal","Object.seal()")}}</dt>
<dd>オブジェクトを封印し、オブジェクトのプロパティの削除を禁止します。</dd>
<dt>{{jsxref("Object.setPrototypeOf","Object.setPrototypeOf()")}}</dt>
<dd>プロトタイプ (内部の <code>[[Prototype]]</code> プロパティ) を設定します。</dd>
<dt>{{jsxref("Object.values","Object.values()")}}</dt>
<dd>指定したオブジェクトの<strong>自身</strong>の列挙可能な文字列プロパティのすべてに対応する値を含む配列を返します。</dd>
</dl>
<h2 id="Instance_properties" name="Instance_properties">インスタンスプロパティ</h2>
<div>
<dl>
<dt>{{jsxref("Object.prototype.constructor")}}</dt>
<dd>オブジェクトのプロトタイプを生成する関数を指定します。</dd>
<dt>{{jsxref("Object.prototype.__proto__")}}</dt>
<dd>オブジェクトがインスタンス化されたとき、プロトタイプとして使用されたオブジェクトを指します。</dd>
<dt>{{jsxref("Object.prototype.__noSuchMethod__")}}</dt>
<dd>未定義のオブジェクトメンバーがメソッドとして呼び出された際に実行される関数を定義します。</dd>
</dl>
</div>
<h2 id="Instance_methods" name="Instance_methods">インスタンスメソッド</h2>
<div>
<dl>
<dt>{{jsxref("Object.prototype.__defineGetter__()")}}</dt>
<dd>指定したプロパティに、アクセスの際に実行されて戻り値を返す関数を関連付けます。</dd>
<dt>{{jsxref("Object.prototype.__defineSetter__()")}}</dt>
<dd>指定したプロパティに、設定の際に実行されてプロパティを変更する関数を関連付けます。</dd>
<dt>{{jsxref("Object.prototype.__lookupGetter__()")}}</dt>
<dd>{{jsxref("Object.prototype.__defineGetter__()", "__defineGetter__()")}} メソッドによって特定のプロパティに関連付けされた関数を返します。</dd>
<dt>{{jsxref("Object.prototype.__lookupSetter__()")}}</dt>
<dd>{{jsxref("Object.prototype.__defineSetter__()", "__defineSetter__()")}} メソッドによって特定のプロパティに関連付けされた関数を返します。</dd>
<dt>{{jsxref("Object.prototype.hasOwnProperty()")}}</dt>
<dd>指定したプロパティが、プロトタイプチェーンを通じて継承されたものではなくオブジェクトが直接持っているプロパティかどうかを示す真偽値を返します。</dd>
<dt>{{jsxref("Object.prototype.isPrototypeOf()")}}</dt>
<dd>指定したオブジェクトが、このメソッドを呼び出した元であるオブジェクトのプロトタイプチェーンにあるかどうかを示す真偽値を返します。</dd>
<dt>{{jsxref("Object.prototype.propertyIsEnumerable()")}}</dt>
<dd>内部の <a href="/ja/docs/Web/JavaScript/Data_structures#Properties">ECMAScript [[Enumerable]] 属性</a> の設定状態を示す真偽値を返します。</dd>
<dt>{{jsxref("Object.prototype.toSource()")}}</dt>
<dd>このメソッドの呼び出し元オブジェクトを表すオブジェクトリテラルからなるソース文字列を返します。この値を使って新しいオブジェクトを作成できます。</dd>
<dt>{{jsxref("Object.prototype.toLocaleString()")}}</dt>
<dd>{{jsxref("Object.toString", "toString()")}} を呼び出します。</dd>
<dt>{{jsxref("Object.prototype.toString()")}}</dt>
<dd>指定したオブジェクトを表す文字列を返します。</dd>
<dt>{{jsxref("Object.prototype.unwatch()")}}</dt>
<dd>オブジェクトのプロパティから代入処理を監視するウォッチポイントを取り除きます。</dd>
<dt>{{jsxref("Object.prototype.valueOf()")}}</dt>
<dd>指定したオブジェクトのプリミティブ値を返します。</dd>
<dt>{{jsxref("Object.prototype.watch()")}}</dt>
<dd>オブジェクトのプロパティに代入処理を監視するウォッチポイントを追加します。</dd>
</dl>
</div>
<h2 id="Examples" name="Examples">例</h2>
<h3 id="Using_Object_given_undefined_and_null_types" name="Using_Object_given_undefined_and_null_types"><code>undefined</code> と <code>null</code> データ型を与えられた <code>Object</code> を使用する</h3>
<p>次の例は、<code>o</code> に空の <code>Object</code> オブジェクトを格納します。</p>
<pre class="brush: js notranslate">let o = new Object()
</pre>
<pre class="brush: js notranslate">let o = new Object(undefined)
</pre>
<pre class="brush: js notranslate">let o = new Object(null)
</pre>
<h3 id="Using_Object_to_create_Boolean_objects" name="Using_Object_to_create_Boolean_objects"><code>Boolean</code> オブジェクトの生成に <code>Object</code> を使用する</h3>
<p>次の例は、<code>o</code> に {{jsxref("Boolean")}} オブジェクトを格納します。</p>
<pre class="brush: js notranslate">// o = new Boolean(true) に同じ
let o = new Object(true)
</pre>
<pre class="brush: js notranslate">// to o = new Boolean(false) に同じ
let o = new Object(Boolean())
</pre>
<h3 id="Object_prototypes" name="Object_prototypes">オブジェクトのプロトタイプ</h3>
<p><code>Object.prototype</code> の既存のメソッドの動作を変更する場合は、既存のロジックの前または後で独自の拡張を囲む形でコードを挿入するようにしてください。例えば、この (テストされていない) コードは、組込みロジックや誰かの拡張機能が実行される前に、条件付きで独自のロジックを実行します。</p>
<p>関数が呼び出されると、呼び出す引数は配列状「変数」 <a href="/ja/docs/Web/JavaScript/Reference/Functions/arguments">arguments</a> に保持されます。例えば <code>myFn(a, b, c)</code> の呼び出しでは、myFn の本体内での引数は (a, b, c) に対応する 3 つの配列状要素を含みます。</p>
<p>フックを使ってプロトタイプを変更する場合は、関数で <code>apply()</code> を呼び出すことで、<code>this</code> と引数 (呼び出し状態) を現在の動作に渡します。このパターンは、<code>Node.prototype</code> や <code>Function.prototype</code> など、どんなプロトタイプにも使えます。</p>
<pre class="brush: js notranslate">var current = Object.prototype.valueOf;
// Since my property "-prop-value" is cross-cutting and isn't always
// on the same prototype chain, I want to modify Object.prototype:
Object.prototype.valueOf = function() {
if (this.hasOwnProperty('-prop-value')) {
return this['-prop-value'];
} else {
// It doesn't look like one of my objects, so let's fall back on
// the default behavior by reproducing the current behavior as best we can.
// The apply behaves like "super" in some other languages.
// Even though valueOf() doesn't take arguments, some other hook may.
return current.apply(this, arguments);
}
}
</pre>
<p>JavaScript はサブクラスオブジェクトを持っていないため、プロトタイプはオブジェクトとして機能する特定の関数の「基本クラス」オブジェクトを作成するための有用な回避策です。例えば、以下のようになります。</p>
<pre class="brush: js notranslate">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; //If you don't set Object.prototype.constructor to Employee,
//it will take prototype.constructor of Person (parent).
//To avoid that, we set the prototype.constructor to Employee (child).
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; //If you don't set Object.prototype.constructor to Customer,
//it will take prototype.constructor of Person (parent).
//To avoid that, we set the prototype.constructor to Customer (child).
var Mime = function(name) {
Person.call(this, name);
this.canTalk = false;
};
Mime.prototype = Object.create(Person.prototype);
Mime.prototype.constructor = Mime; //If you don't set Object.prototype.constructor to Mime,
//it will take prototype.constructor of Person (parent).
//To avoid that, we set the prototype.constructor to Mime (child).
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();</pre>
<h2 id="Specifications" name="Specifications">仕様</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">仕様書</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('ESDraft', '#sec-object-objects', 'Object')}}</td>
</tr>
</tbody>
</table>
<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2>
<div>
<div class="hidden">このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、<a class="external" href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> をチェックアウトしてプルリクエストを送信してください。</div>
<p>{{Compat("javascript.builtins.Object")}}</p>
</div>
<h2 id="See_also" name="See_also">関連情報</h2>
<ul>
<li><a href="/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer">オブジェクト初期化子</a></li>
</ul>
|