2009-09-28 20 views
42

Jak mogę sprawdzić, czy mój obiekt javascript jest określonego typu.Typ JavaScript obiektu niestandardowego

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

W powyższym przypadku typeof s1 zwróci "obiekt". To niezbyt pomocne. Czy jest jakiś sposób sprawdzenia, czy s1 jest typu SomeObject?

Odpowiedz

65

Tak, używając instanceof (MDN link | spec link):

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

Rzeczywiście, sięga najwcześniejszych JavaScript wersja Netscape 2.0. (Innym powodem, dla którego nie ma połączenia z ECMA-262, jest to, że jest on niewyraźnie niejasny i nieczytelny, nawet według standardów standardów dokumentu!) – bobince

+0

@bobince: To wymaga trochę przyzwyczajenia się do stylu. :-) –

+0

@bobince: Patrząc na specyfikację ES6 ... cóż ... powiedzmy, że teraz aktywnie wracam do dni świetności w specyfikacji ES5. :-) –

3

Idea skradziony od http://phpjs.org/functions/get_class/, zamieszczone przez SeanJA. Zgrywanie się do pracy tylko z obiektami i bez konieczności wyrażenia regularnego:

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()); 

Właśnie dowiedziałem łatwiejszy sposób, aby wyodrębnić nazwę funkcji od konstruktora:

obj.constructor.name 
10

Cokolwiek robisz, uniknąć OBJ .constructor.name lub dowolna ciągowa wersja konstruktora. Że działa świetnie, dopóki nie zeszpecić/minify swój kod, to wszystkie przerwy ponieważ konstruktor zostanie zmieniona na coś niejasnego (ex: „n”) i kod będzie nadal to robić i nie pasuje:

// 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') {} 

Uwaga:

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

(BTW, muszę większą renomę wypowiedzieć się na temat innych godnych odpowiedzi tutaj)

+2

[Zobacz ten link] (http://engblog.yext.com/post/js-type-checking). Właściwość konstruktora to kolejna interesująca droga. Po prostu kontynuuj, aby uniknąć podejść łańcuchowych. – AAron

Powiązane problemy