2013-07-18 14 views
5

Domanda JavaScript principiante. Sono un po 'rovinato dalla funzione built-in dir di Python. Voglio scoprire le proprietà/metodi di qualsiasi oggetto nel REPL di node.js. Ho già visto this question; la risposta accettata non riesce (nel REPL node) nel caso semplice di un array vuoto []. Per esempio:L'introspezione JavaScript è completa

for(var prop in []){console.log(prop);} # returns undefined, prints nothing 
[].length # returns 0 

Dal momento che il ciclo for non scopre il metodo dell'array length, non ritengo che per essere adeguata introspezione. Quindi, qualcuno potrebbe riempire il vuoto qui:

function magic(some_object) { 
    # magic goes here 
} 

console.log(magic([])) # should print a list that includes 'length' 

O si tratta semplicemente non è possibile, o possibile solo per i "tipi di utente"?

+0

È possibile utilizzare il completamento automatico nella REPL FYI e funziona abbastanza bene per vedere la maggior parte delle cose, ma una risposta completa alla tua domanda è piuttosto complicato. Principalmente si può ottenere ciò che si vuole, ma richiede un sacco di trucchi abbastanza grande. 'util.inspect' e' console.log' nel nodo sono anche pratici, e ho scritto la mia implementazione 'util.inspect' in un punto che posterò una volta che la trovo se una risposta non è stata accettata per allora. –

risposta

8

Quanto tempo occorre per la compatibilità con il browser? Tutti i browser moderni dovrebbero supportare Object.getOwnPropertyNames(). Utilizzando il tuo esempio, Object.getOwnPropertyNames([]) restituirà ["length"].

Maggiori informazioni qui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

Modifica: Altri esempi:

  • Object.getOwnPropertyNames([1, 2, 3]); restituisce ["0", "1", "2", "length"]

  • Object.getOwnPropertyNames(String); rendimenti ["prototype", "quote", "substring", "toLowerCase", "toUpperCase", "charAt", "charCodeAt", "contains", "indexOf", "lastIndexOf", "startsWith", "endsWith", "trim", "trimLeft", "trimRight", "toLocaleLowerCase", "toLocaleUpperCase", "localeCompare", "match", "search", "replace", "split", "substr", "concat", "slice", "fromCharCode", "length", "name", "arguments", "caller"]

Modifica n. 2: Ok, visto che stai cercando un elenco completo di proprietà e metodi, inclusi quelli ereditati, ho preso in prestito da altre due domande SO (collegate sotto) e ho trovato una soluzione che appare per ottenere ancora di più:

var findProperties = function(obj) { 
    var aPropertiesAndMethods = []; 

    do { 
     aPropertiesAndMethods = aPropertiesAndMethods.concat(Object.getOwnPropertyNames(obj)); 
    } while (obj = Object.getPrototypeOf(obj)); 

    for (var a = 0; a < aPropertiesAndMethods.length; ++a) { 
     for (var b = a + 1; b < aPropertiesAndMethods.length; ++b) { 
      if (aPropertiesAndMethods[a] === aPropertiesAndMethods[b]) { 
       aPropertiesAndMethods.splice(a--, 1); 
      } 
     } 
    } 

    return aPropertiesAndMethods; 
} 

Quindi, se si usa chiamare findProperties([]), restituisce ["length", "join", "reverse", "sort", "push", "pop", "shift", "unshift", "splice", "concat", "slice", "lastIndexOf", "indexOf", "forEach", "map", "reduce", "reduceRight", "filter", "some", "every", "iterator", "constructor", "toSource", "toString", "toLocaleString", "valueOf", "watch", "unwatch", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "__defineGetter__", "__defineSetter__", "__lookupGetter__", "__lookupSetter__"]

questioni legate

javascript inheritance, reflection and prototype chain walking?

How to merge two arrays in Javascript and de-duplicate items

+2

Bene, sono in 'node' non un browser, ma questo è nella giusta direzione. Non mi dà comunque tutto comunque. 'Object.getOwnPropertyNames ([])' restituisce '['length']', sebbene un array vuoto abbia anche un metodo '.toString()'. E 'Object.getOwnPropertyNames (Array)' fornisce più metodi (incluso 'prototype') ma non ancora' toString'. Puoi ottenere il mio upvote, ma mi piacerebbe comunque ottenere * tutto * le proprietà/i metodi che sono validi se possibile. – wberry

+1

Ok, quindi non stai solo cercando le proprietà e i metodi dell'oggetto reale, ma anche quelli che eredita? Perché, tecnicamente, 'toString' è un metodo di' Object.prototipo' e che è semplicemente ereditato da 'Array'. Non sono sicuro se c'è un modo per afferrare anche i metodi e le proprietà ereditate. . . – talemyn

+1

Aha penso che sto imparando qui. Quindi potrei scrivere una funzione che segue l'albero di ereditarietà fino a 'Object' e costruisce un insieme di tutto ciò che trova? Non vedo un modo ovvio per farlo. 'Object.getPrototypeOf ([])' restituisce '[]' non 'Array'. – wberry

Problemi correlati