Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

instanceof

BaselineWidely available

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

試してみましょう

function Car(make, model, year) {  this.make = make;  this.model = model;  this.year = year;}const auto = new Car("Honda", "Accord", 1998);console.log(auto instanceof Car);// Expected output: trueconsole.log(auto instanceof Object);// Expected output: true

構文

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; // trueo3 instanceof C; // true : o3 のプロトタイプチェーンに C.prototype があるため

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

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

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

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

例えば、別のコンテキストでNodeSVGElement であるかどうかをチェックするには、myNode instanceof myNode.ownerDocument.defaultView.SVGElement を使用してください。

instanceof を String に対して使用

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

js
let literalString = "これは文字列リテラルです";let stringObject = new String("コンストラクターで作成された String です");literalString instanceof String; // false : 文字列リテラルは String ではないstringObject instanceof String; // trueliteralString instanceof Object; // false : 文字列リテラルは Object ではないstringObject instanceof Object; // truestringObject instanceof Date; // false

instanceof を Date に対して使用

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

js
let myDate = new Date();myDate instanceof Date; // truemyDate instanceof Object; // truemyDate instanceof String; // false

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

以下の例では、instanceofObject.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; // truerect instanceof Shape; // truerect instanceof Rectangle; // truerect instanceof String; // falselet literalObject = {};let nullObject = Object.create(null);nullObject.name = "My object";literalObject instanceof Object; // true : すべてのオブジェクトリテラルは Object.prototype をプロトタイプとして持つ({}) instanceof Object; // true : 上記と同じnullObject instanceof Object; // false : プロトタイプはプロトタイプチェーンの末尾 (null)

mycarCar 型およびObject 型であることを示す

以下のコードは、Car オブジェクト型とそのインスタンスであるmycar を生成しています。instanceof 演算子で、mycarCar 型および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 になります。(!mycarinstanceof の前に評価されるため、常に論理値がCar のインスタンスであるかどうかを検査しようとします。)

仕様書

Specification
ECMAScript® 2026 Language Specification
# sec-relational-operators

ブラウザーの互換性

関連情報

Help improve MDN

Learn how to contribute.

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp