2013-09-01 13 views
6

dato qualche oggetto y, come posso scoprire il più specifico X in modo tale che l'espressioneCome ottenere X più specifica tale che l'istanza di X è vera?

y instanceof X 

restituisce true?

Per esempio, le due espressioni seguenti entrambi restituiscono true

[] instanceof Object 
[] instanceof Array 

... ma Array è più specifico di Object.

+3

Credo che sia 'y.constructor'. –

+0

Anche [Come ottenere una classe dell'oggetto JavaScript?] (Http://stackoverflow.com/questions/1249531/how-to-get-a-javascript-objects-class) –

+0

http://stackoverflow.com/questions/ 1249531/how-to-get-a-javascript-oggetti-class – ash

risposta

1

Secondo MDN:

instanceof test operatore se un oggetto contiene nella sua catena di prototipi proprietà prototipo di un costruttore.

Quindi Kolink è corretto che il controllo y.constructor ti darà la risposta. (Si noti che questo si presuppone o qualcun altro non ha maciullato y.constructor nel frattempo, vale a dire che y s' __proto__ (l'inizio della sua catena di prototipi) in realtà punta a y.constructor.prototype)

0

Ecco un codice che ho appena scritto questo fa il lavoro. Leggi i commenti per ulteriori dettagli!

Nota: Ho provato questo frammento di codice in Google Chrome!

function compareTypes(a,b){ 
    if (a instanceof b) { 
     if(b instanceof a) { 
      /* same types */ 
      return 0; 
     } 
     else { 
      /* first is son */ 
      return -1; 
     } 
    } 
    if (b instanceof a) { 
     /* second is son */ 
     return 1; 
    } 
    return 0; /* not related to each other */ 
} 

function closestInstanceOf(obj, possibleTypesAsAdditionalArguments) { 
    /* 
    * How to call this function: 
    * The first argument should be the object to check. 
    * All other arguments are possible types. 
    */ 

    if (arguments.length === 0) 
     return; /* undefined */ 

    if (arguments.length === 1) 
     return Object; /* If no possible type was passed, we returned Object as the base type */ 

    /* converts the arguments to Javascript array */ 
    var types = Array.prototype.slice.call(arguments, 0); 

    var obj = types[0]; /* object to be checked */ 
    types.splice(0, 1); /* possible types */ 

    /* Sorts the types array from the more specific to the more generic type */ 
    types.sort(compareTypes); 

    /* find the first match */ 
    for (var i = 0; i < types.length; i++) { 
     var type = types[i]; 
     if (obj instanceof type) { 
      return type; 
     } 
    } 
    return Object; 
} 

// examples 

// 1. Sorting types 
console.info([Array, Number, Object, String, Boolean].sort(compareTypes)); 
// results: 
//[function, function, function, function, function] 
// 0: function Array() { [native code] } 
// 1: function Number() { [native code] } 
// 2: function String() { [native code] } 
// 3: function Boolean() { [native code] } 
// 4: function Object() { [native code] } 

// 2. Find specific type 
console.info(closestInstanceOf([], Array, Number, Object, String, Boolean)); 
// results: 
// function Array() { [native code] } 

// 3. Find specific type 
console.info(closestInstanceOf(new String("Hello World"), Array, Number, Object, String, Boolean)); 
// results: 
// function String() { [native code] } 

// 4. Find specific type 
console.info(closestInstanceOf(new Number(19), Array, Number, Object, String, Boolean)); 
// results: 
// function Number() { [native code] } 

// 5. Find specific type 
console.info(closestInstanceOf("Hello world", Array, Number, Object, String, Boolean)); 
// results: 
// function Object() { [native code] } 
// Note: String iterals derived from object! 

// 6. Find specific type 
console.info(closestInstanceOf(18, Array, Number, Object, String, Boolean)); 
// results: 
// function Object() { [native code] } 
// The same applies for numbers 

// 7. Find specific type 
console.info(closestInstanceOf(false, Array, Number, Object, String, Boolean)); 
// results: 
// function Object() { [native code] } 
// And booleans... 

// 8. Find specific type 
console.info(closestInstanceOf(new Boolean(false), Array, Number, Object, String, Boolean)); 
// results: 
// function Object() { [native code] } 
// Again, using new Boolean does the job! 


// 9. Find specific type 
console.info(closestInstanceOf(function() { /* this is custom class */ }, Array, Number, Object, String, Boolean)); 
// results: 
// function Object() { [native code] } 
// This code works for custom class as well, try it! 
Problemi correlati