2014-07-11 10 views
5

Tutte le nostre classi dattiloscritto ereditano (direttamente o indirettamente) da:dattiloscritto MyObject.instanceOf()

export class WrObject { 
    className:string; 

    public instanceOf(name : String) : boolean { 
     return this.className === name; 
    } 
} 

Abbiamo poi dichiariamo una sottoclasse come:

export class Section extends WrObject { 
    public static CLASS_NAME = 'Section'; 
    className = Section.CLASS_NAME; 

     public instanceOf(name : String) : boolean { 
      if (this.className === name) 
       return true; 
      return super.instanceOf(name); 
     } 

} 

e si può quindi controllare con:

if (obj.instanceOf(Section.CLASS_NAME)) 

Tutto funziona alla grande. Tuttavia, penso che sarebbe più pulito se potessimo fare:

if (obj.instanceOf(Section)) 

C'è un modo per farlo? O qualche suggerimento su un approccio migliore?

grazie - Dave

risposta

13

Se siete disposti ad accettare la natura prototipale di JavaScript voi può ju st utilizzare instanceof che controlla la catena di prototipi:

class Foo{} 
class Bar extends Foo{} 
class Bas{} 

var bar = new Bar(); 

console.log(bar instanceof Bar); // true 
console.log(bar instanceof Foo); // true 
console.log(bar instanceof Object); // true 

console.log(bar instanceof Bas); // false 
+0

ho pensato (non riesce a trovare il post qui ora) che l'utilizzo di instanceof è stato scoraggiato a macchina come essere impreciso. Ho frainteso gli altri thread? –

+1

dipende. Non hai intenzione di usare 'instanceof' su un' null' sei tu? ;) + è inaffidabile tra iframes (non è lo stesso 'Foo.prototype' in ogni frame se si controlla per riferimento che è ciò che questo sta facendo sotto). Probabilmente lo stesso problema nei webworker, ma non sono sicuro che – basarat

+0

con valori nulli - no. Nel web worker - sì ovunque. Ed è con oggetti creati in un thread, pubblicati su un altro thread, e nel thread ricevente assegniamo proto per trasformare nuovamente i dati ricevuti in un oggetto. –

0

Credo che questo potrebbe funzionare Example on Playground

var getName = function(obj) : string { 
    var funcNameRegex = /function (.{1,})\(/; 
    var results = (funcNameRegex).exec(obj); 
    return (results && results.length > 1) ? results[1] : ""; 
}; 

class Foo 
{ 

} 

function IsTypeOf(obj: any, type: Function) 
{ 
    alert(obj.constructor.name + " == " + getName(type)); 
} 

IsTypeOf(new Foo(), Foo); 

correlati

2

Si può fare. Basta sostituire il vostro instanceOf implementazione con questo:

public instanceOf(cls: { CLASS_NAME: string; }) { 
    return cls.CLASS_NAME === this.className || super.instanceOf(cls); 
} 
+2

Attenzione al fatto che le classi in spazi dei nomi diversi con lo stesso nome potrebbero essere un problema. Programming.Parent e Genealogy.Parent sono classi molto diverse in diversi alberi di ereditarietà e spazi dei nomi, ma verrebbero falsamente testati qui perché i loro nomi di stringhe corrispondono. –