2013-07-18 7 views
5

Anfänger JavaScript-Frage. Ich bin auf der eingebauten Funktion dir von Python irgendwie verwöhnt. Ich möchte die Eigenschaften/Methoden jedes Objekts in der node.js REPL entdecken. Ich habe schon this question gesehen; die angenommene Antwort schlägt fehl (in der node REPL) im einfachen Fall eines leeren Arrays []. Zum Beispiel:JavaScript Introspektion, die abgeschlossen ist

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

Da die for Schleife nicht das Array nicht entdeckt length Methode, ich glaube nicht, daß die richtige Selbstbeobachtung sein. So könnte jemand in den leeren füllt hier:

function magic(some_object) { 
    # magic goes here 
} 

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

Oder ist dies einfach nicht möglich, oder nur für „Benutzertypen“?

+0

Sie können FYI Tabulatorvervollständigung in der REPL verwenden und es funktioniert ziemlich gut die meisten Dinge zu sehen, aber eine vollständige Antwort auf Ihre Frage ist ziemlich kompliziert. Meistens kann man erreichen, was man will, aber es erfordert eine ziemlich große Trickkiste. 'util.inspect' und' console.log' in Node sind auch praktisch, und ich habe meine eigene 'util.inspect'-Implementierung an einem Punkt geschrieben, den ich posten werde, sobald ich es gefunden habe, wenn eine Antwort bis dahin nicht akzeptiert wurde. –

Antwort

8

Wie weit zurück müssen Sie in der Browserkompatibilität gehen? Alle modernen Browser sollten unterstützen. In Ihrem Beispiel gibt Object.getOwnPropertyNames([])["length"] zurück.

Mehr Infos hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

Edit: Weitere Beispiele:

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

  • Object.getOwnPropertyNames(String); kehrt ["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"]

Bearbeiten # 2: Okay, so dass Sie eine vollständige Liste der Eigenschaften und Methoden suchen, einschließlich der geerbten, habe ich von zwei anderen SO Fragen ausgeliehen (unten verlinkt) und eine Lösung, die erscheint erhalten Sie noch näher:

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; 
} 

, wenn Sie also findProperties([]) nennen verwenden, gibt sie ["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__"]

verlinkte Fragen

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

+2

Nun, ich bin in 'node' kein Browser, aber das ist in die richtige Richtung. Ich gebe aber immer noch nicht alles. 'Object.getOwnPropertyNames ([])' gibt '['length']' zurück, obwohl ein leeres Array auch eine '.toString()' Methode hat. Und 'Object.getOwnPropertyNames (Array)' bietet mehr Methoden (einschließlich 'Prototyp'), aber immer noch nicht' toString'. Du bekommst meinen upvote, aber ich möchte programmgesteuert immer * all * die Eigenschaften/Methoden erhalten, die gültig sind, wenn ich kann. – wberry

+1

Okay, Sie suchen nicht nur nach den Eigenschaften und Methoden des tatsächlichen Objekts, sondern auch nach den Eigenschaften, die es erbt? Denn "toString" ist technisch eine Methode von 'Object.Prototyp "und das wird einfach von" Array "geerbt. Nicht sicher, ob es eine Möglichkeit gibt, die vererbten Methoden und Eigenschaften zu erfassen. . . – talemyn

+1

Aha Ich denke, ich lerne hier. Also könnte ich eine Funktion schreiben, die dem Vererbungsbaum bis zu "Object" folgt und eine Menge von allem erstellt, was sie findet? Ich sehe keinen offensichtlichen Weg, das zu tun. 'Object.getPrototypeOf ([])' gibt nur '[]' nicht 'Array' zurück. – wberry

Verwandte Themen