ECMAScript 5オブジェクトには、として知られる内部プロパティがあります[[Class]]
。これは、ES5であなたが求めているものに最も近いものです。次のように[[Class]]
アクセスできます。Object.prototype.toString
function getClassOf(obj) {
return Object.prototype.toString.call(obj).slice(8, -1);
}
getClassOf([ ]); // => "Array"
getClassOf(new Date()); // => "Date"
getClassOf(function() { }); // => "Function"
getClassOf(3); // => "Number"
getClassOf(true) // => "Boolean"
getClassOf(document.createElement('div')); // => "HTMLDivElement"
getClassOf(Math); // => "Math"
getClassOf(null); // => "Null"
getClassOf(undefined); // => "Undefined"
getClassOf({ x: 1 }); // => "Object"
この動作は、他のフレームからのオブジェクトを適切に識別するために重要です。
ただし、ユーザー定義のコンストラクターでは機能しません。ユーザー定義のコンストラクターで作成されたオブジェクトには。があり[[Class]]
"Object"
ます。
function Foo() { }
var foo = new Foo();
getClassOf(foo); // => "Object"
ECMAScript 6には、によって返されるものを拡張する機能があるObject.prototype.toString
ようです。そのため、シンボルを介して実行されるgetClassOf(foo)
可能性があります。"Foo"
@@toStringTag
今後の標準の詳細については、https://mail.mozilla.org/pipermail/es-discuss/2012-September/025344.htmlを参照してください。
あなたはこのようにあなたがしたいことをするためにあなた自身の関数を作ることができます:
function getTypeOf(value) {
// Return "null" for null.
if (value === null) return 'null';
// Return primitive types.
var type = typeof value;
if (type != 'object') return type;
// Return [[Class]] if available for objects.
type = Object.prototype.toString.call(value).slice(8, -1);
if (type != 'Object') return type;
// Return "Object" if it wasn't created with another constructor.
var proto = Object.getPrototypeOf(value);
if (proto == Object.prototype)
return 'Object';
// Return the constructor name if constructor hasn't been
// modified on the object.
if (value.constructor && proto === value.constructor.prototype)
return value.constructor.name;
// Return the constructor name if constructor hasn't been
// modified on the prototype.
if (proto.constructor && proto === proto.constructor.prototype)
return proto.constructor.name;
// Return "???" if the type is indeterminable.
return '???';
}
例:
getTypeOf([ ]); // => "Array"
getTypeOf(new Date()); // => "Date"
getTypeOf(function() { }); // => "Function"
getTypeOf(3); // => "number"
getTypeOf(true) // => "boolean"
getTypeOf(document.createElement('div')); // => "HTMLDivElement"
getTypeOf(Math); // => "Math"
getTypeOf(null); // => "null"
getTypeOf(undefined); // => "undefined"
getTypeOf({ x: 1 }); // => "Object"
function Foo() { }
var foo = new Foo();
getTypeOf(foo); // => "Foo"
// If the constructor property is changed, still works.
foo.constructor = function FakeConstructor() { };
getTypeOf(foo); // => "Foo"
// If the constructor property AND the prototype's constructor is
// changed, result is "???".
foo.constructor = function FakeConstructor() { };
Foo.prototype.constructor = function FakeConstructor2() { };
getTypeOf(foo); // => "???"