aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/javascript/reference/operators/instanceof/index.md
blob: d2cab1f7ab880e8d99be19089e19244c798d48e7 (plain)
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
---
title: instanceof
slug: Web/JavaScript/Reference/Operators/instanceof
tags:
  - JavaScript
  - 言語機能
  - オブジェクト
  - 演算子
  - プロトタイプ
  - 関連演算子
  - instanceof
browser-compat: javascript.operators.instanceof
translation_of: Web/JavaScript/Reference/Operators/instanceof
---
{{jsSidebar("Operators")}}

**`instanceof` 演算子**は、あるコンストラクターの `prototype` プロパティが、あるオブジェクトのプロトタイプチェーンの中のどこかに現れるかどうかを検査します。返値は論理値です。

{{EmbedInteractiveExample("pages/js/expressions-instanceof.html")}}

## 構文

```js
object instanceof constructor
```

### 引数

- `object`
  - : 検査するオブジェクトです。
- `constructor`
  - : 検査対象の関数です。

## 解説

`instanceof` 演算子は、`object` のプロトタイプチェーンに `constructor.prototype` が存在することを検査します。

```js
// コンストラクターを定義
function C() {}
function D() {}

let o = new C()

// true : Object.getPrototypeOf(o) === C.prototype であるため
o instanceof C

// false : D.prototype は o のプロトタイプチェーンのどこにも存在しないため
o instanceof D

o instanceof Object           // true : なぜなら...
C.prototype instanceof Object // true であるため

C.prototype = {}
let o2 = new C()

o2 instanceof C  // true

// false : C.prototype は o のプロトタイプチェーンの
// どこにも存在しないため
o instanceof C

D.prototype = new C()  // 継承を使用
let o3 = new D()
o3 instanceof D  // true
o3 instanceof C  // true : o3 のプロトタイプチェーンに C.prototype があるため
```

なお、 `instanceof` の値の検査結果はコンストラクターの `prototype` プロパティが変化すると変わることがあります。また、オブジェクトのプロトタイプを `Object.setPrototypeOf` を用いて変更した場合や、標準外の `__proto__` プロパティを用いた場合も変わることがあります。

### `instanceof` と複数のコンテキスト (例: frame や window)

スコープが異なると、実行環境が変わります。つまり、組み込まれているものも変わります(別々なグローバルオブジェクト、別々なコンストラクター、など)。これにより予期せぬ結果になる場合があります。例えば、`[] instanceof window.frames[0].Array` は `false` を返します。 `Array.prototype !== window.frames[0].Array.prototype` であり、配列は前者を継承しているからです。

これは、始めはわかりにくいかもしれませんが、スクリプトで複数のフレームやウィンドウを扱い、オブジェクトをあるコンテキストから別のコンテキストへ関数を経由して渡すようになると、正当かつ重要な事項になります。例えば、`Array.isArray(myObj)` を使用すると、与えられたオブジェクトが実際に配列であるかどうかを安全にチェックできます。

例えば、別のコンテキストで [Node](/ja/docs/Web/API/Node) が [SVGElement](/ja/docs/Web/API/SVGElement) であるかどうかをチェックするには、`myNode instanceof myNode.ownerDocument.defaultView.SVGElement` を使用してください。

## 例

### instanceof を String に対して使用

以下の例では、 `instanceof``String` オブジェクトに使用した場合の動作を示しています。

```js
let literalString = 'これは文字列リテラルです';
let stringObject  = new String('コンストラクターで作成された String です');

literalString instanceof String;  // false : 文字列リテラルは String ではない
stringObject  instanceof String;  // true

literalString instanceof Object;  // false : 文字列リテラルは Object ではない
stringObject  instanceof Object;  // true

stringObject  instanceof Date;    // false
```

### instanceof を Date に対して使用

以下の例では、 `instanceof``Date` オブジェクトに使用した場合の動作を示しています。

```js
let myDate = new Date();

myDate instanceof Date;      // true
myDate instanceof Object;    // true
myDate instanceof String;    // false
```

### Object.create() で生成された Object

以下の例では、 `instanceof``Object.create()` で生成したオブジェクトに使用した場合の動作を示しています。

```js
function Shape() {
}

function Rectangle() {
  Shape.call(this); // スーパークラスのコンストラクターを呼び出す。
}

Rectangle.prototype = Object.create(Shape.prototype);

Rectangle.prototype.constructor = Rectangle;

let rect = new Rectangle();

rect instanceof Object;    // true
rect instanceof Shape;     // true
rect instanceof Rectangle; // true
rect instanceof String;    // false

let literalObject     = {};
let nullObject  = Object.create(null);
nullObject.name = "My object";

literalObject    instanceof Object;   // true : すべてのオブジェクトリテラルは Object.prototype をプロトタイプとして持つ
({})             instanceof Object;   // true : 上記と同じ
nullObject       instanceof Object;   // false : プロトタイプはプロトタイプチェーンの末尾 (null)
```

### `mycar` が `Car` 型および `Object` 型であることを示す

以下のコードは、`Car` オブジェクト型とそのインスタンスである `mycar` を生成しています。`instanceof` 演算子で、`mycar` は `Car` 型および `Object` 型であることを示します。

```js
function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
let mycar = new Car('Honda', 'Accord', 1998)
let a = mycar instanceof Car     // true を返す
let b = mycar instanceof Object  // true を返す
```

### instanceof の否定

あるオブジェクトが特定のコンストラクターの `instanceof` でないことを検査するには、次のようにします。

```js
if (!(mycar instanceof Car)) {
  // 次のようなことをします。
  // mycar = new Car(mycar)
}
```

これは実際には次のものとは異なります。

```js
if (!mycar instanceof Car)
```

これは常に `false` になります。(`!mycar` は `instanceof` の前に評価されるため、常に論理値が `Car` のインスタンスであるかどうかを検査しようとします。)

## 仕様書

{{Specifications}}

## ブラウザーの互換性

{{Compat}}

## 関連情報

- [`typeof`](/ja/docs/Web/JavaScript/Reference/Operators/typeof)
- {{jsxref("Symbol.hasInstance")}}
- {{jsxref("Object.prototype.isPrototypeOf")}}