型(クラス)の判定

《 初回公開:2022/11/17 , 最終更新:未 》

型(クラス)の判定については不思議の国のJavaScript オブジェクト指向に関するtipsの「クラスの判別と
prototypeオブジェクトのconstructorプロパティとinstanceofとtypeof演算子」
の項で一度とりあげた事がある。

そこではconstructorプロパティとinstanceofとtypeof演算子について述べた。
ここでは主に、それ以外の方法について取り上げる。

【 目次 】

Object.prototype.isPrototypeOfメソッド

isPrototypeOfメソッドは、オブジェクトが別のオブジェクトのプロトタイプチェーンに存在するかどうかを判定する。
isPrototypeOfメソッドはinstanceof演算子と同様にはプロトタイプチェンを使ったクラスの継承関係にあるクラスに対してもtrueを返すので、trueを返したからと言って確実にそのクラスの直接のインスタンスとは言えない事に注意。

機能的にはinstanceof演算子と違いは無い。

class SuperCls { }
class SubCls extends SuperCls { }
class SubSubCls extends SubCls { }

let o = new SubSubCls();

console.log(o instanceof SubSubCls);    // true
console.log(o instanceof SubCls);   // true
console.log(o instanceof SuperCls); // true

console.log(o instanceof Function); // false
console.log(o instanceof Object);   // true

console.log(SubSubCls.prototype.isPrototypeOf(o));  // true
console.log(SubCls.prototype.isPrototypeOf(o)); // true
console.log(SuperCls.prototype.isPrototypeOf(o));   // true

console.log(Function.prototype.isPrototypeOf(o));   // false
console.log(Object.prototype.isPrototypeOf(o)); // true

o = Object.create(null);

console.log(o instanceof Object)    // false
console.log(Object.prototype.isPrototypeOf(o)); // false

あえて違いをあげると、instanceofは演算子で、Object.prototype.isPrototypeOfはメソッド

クラス名の取得

クラスはnameプロパティよりクラス名を得る事ができる。

class MyCls { }
console.log(MyCls.name);    // MyCls

// クラスオブジェクトを別の変数に代入しても同じ
let cls = MyCls;
console.log(cls.name);      // MyCls

インスタンスのconstructorプロパティはクラスを指しており、そのnameプロパティからクラス名を得る事ができる。

let myObj = new MyCls();
console.log(myObj.constructor.name);    // MyCls

let clsObj = new cls();
console.log(clsObj.constructor.name);   // MyCls

Object.prototype.toString

Object.prototype.toStringメソッドはオブジェクトを表す文字列を返すが、通常それは "[object 型名]" という文字列になるので。これを型の判定に利用する事もできる。

参考サイトのサンプルコードを少し修正して引用すると

const toString = Object.prototype.toString;

console.log(toString.call(new Date()));    // [object Date]
console.log(toString.call(new String()));  // [object String]
// Mathクラスは特別で、関数オブジェクトでは無いためnewキーワードが使えないようだ。
console.log(toString.call(Math));        // [object Math]

// Since JavaScript 1.8.5
console.log(toString.call(undefined));   // [object Undefined]
console.log(toString.call(null));        // [object Null]

上記のコードでMathクラスは特別で、関数オブジェクトでは無いためnewキーワードが使えない。

この、Object.prototype.toStringが"[object 型名]"を返すのは組み込み型について言える事のようでであって、ユーザ定義のクラスに対してはクラスの判定には使えない。

console.log(toString.call(new MyCls));  // [object Object]
console.log(toString.call(myObj));      // [object Object]

このため、クラス名の判定は前項の「クラス名の取得」で述べた方法を使った方が良さそう。

JavaScript 組み込み型

参考までにJavaScriptの組み込み型について

代表的なものをあげると

  • Array オブジェクト
  • String オブジェクト
  • Math オブジェクト
  • Date オブジェクト
  • Number オブジェクト
  • JSON オブジェクト

JavaScript のデータ型とデータ構造 - JavaScript | MDNも参照。

プリミティブデータ型としては

  • Boolean
  • Null
  • Undefined
  • Number
  • String
  • Symbol (ECMAScript 6 の新データ型)

参考までに

ページのトップへ戻る