2009-09-28 15 views
42

Wie kann ich überprüfen, ob mein Javascript-Objekt von einem bestimmten Typ ist.Javascript Typ von benutzerdefinierten Objekt

var SomeObject = function() { } 
var s1 = new SomeObject(); 

Im Fall oben typeof s1 zurückkehren wird "Objekt". Das ist nicht sehr hilfreich. Gibt es eine Möglichkeit zu überprüfen, ob s1 vom Typ SomeObject ist?

Antwort

65

Ja, mit instanceof (MDN link | spec link):

if (s1 instanceof SomeObject) { ... } 
+0

Tatsächlich geht es zurück in den frühesten JavaScript-Version in Netscape 2.0. (Ein weiterer Grund, nicht mit ECMA-262 zu verlinken, ist, dass es erstaunlich unklar und unlesbar ist, sogar nach Standards - Dokumentstandards!) – bobince

+0

@bobince: Es braucht etwas, um sich an den Stil zu gewöhnen. :-) –

+0

@bobince: Mit Blick auf die ES6-Spezifikation ... nun ... sagen wir einfach, dass ich jetzt aktiv nach den glorreichen Tagen der Klarheit in der ES5-Spezifikation sehne. :-) –

3

Idee gestohlen von http://phpjs.org/functions/get_class/, geposted von SeanJA. Ripped unten mit Objekten arbeiten nur und ohne Notwendigkeit für einen regulären Ausdruck:

function GetInstanceType(obj) 
{ 
    var str = obj.constructor.toString(); 
    return str.substring(9, str.indexOf("(")); 
} 

function Foo() { 
    this.abc = 123; 
} 

// will print "Foo" 
GetInstanceType(new Foo()); 

ich nur einen einfacheren Weg gelernt, die Funktionsnamen aus dem Konstruktor zu extrahieren:

obj.constructor.name 
10

Was immer Sie tun, vermeiden obj .constructor.name oder eine beliebige Zeichenfolgenversion des Konstruktors. Das funktioniert gut, bis Sie Ihren Code verunstalten/minify, dann alle Pausen, da der Konstruktor etwas obskuren umbenannt wird (zB: ‚n‘) und der Code wird dies immer noch tun und nie passen:

// Note: when uglified, the constructor may be renamed to 'n' (or whatever), 
// which breaks this code since the strings are left alone. 
if (obj.constructor.name === 'SomeObject') {} 

Hinweis:

// Even if uglified/minified, this will work since SomeObject will 
// universally be changed to something like 'n'. 
if (obj instanceof SomeObject) {} 

(BTW, ich brauche relativ hohe Ansehen auf den anderen würdigen Antworten kommentieren hier)

+2

[Siehe diesen Link] (http://engblog.yext.com/post/js-type-checking). Die Konstruktoreigenschaft ist ein weiterer interessanter Weg. Vermeiden Sie einfach die String-Ansätze. – AAron

Verwandte Themen