2010-07-15 10 views

Antwort

12

Sie können die Eigenschaften im Objekt durchlaufen und deren Typ testen.

for(var prop in whatever) { 
    if(typeof whatever[prop] == 'function') { 
     //do something 
    } 
} 
+0

+1 jeder Weg 2 die Argumente zu einer Funktion erhalten? – deostroll

+0

Nein. Alle nativen JavaScript-Funktionen akzeptieren sowieso eine beliebige Anzahl von Argumenten. –

+0

@deostroll In einem Browser, der toSource, firefox nur jetzt implementiert, können Sie 'func.toSource(). Match (/ \ (([^ \ (\)] +) \) /) [1]' verwenden. Dies funktioniert jedoch nicht mit integrierten Funktionen. – Annan

6

Um zu den vorhandenen Antworten hinzuzufügen, ECMAScript 5th ED. bietet die Möglichkeit, mit der Methode Object.getOwnPropertyNames auf alle Eigenschaften eines Objekts (auch auf nicht aufzählbare Objekte) zuzugreifen. Beim Versuch, die Eigenschaften von nativen Objekten wie Math aufzuzählen, ein for..in

for(var property in Math) { 
    console.log(property); 
} 

wird nichts auf der Konsole aus. Allerdings

Object.getOwnPropertyNames(Math) 

zurückkehren wird:

["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "abc", "LN2", "cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"] 

Sie könnten eine Hilfsfunktion auf dieses schreiben, die nur Methoden ein Objekt gegeben zurück.

function getMethods(object) { 
    var properties = Object.getOwnPropertyNames(object); 
    var methods = properties.filter(function(property) { 
     return typeof object[property] == 'function'; 
    }); 
    return methods; 
} 

> getMethods(Math) 
["cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"] 

Unterstützung für ECMAScript 5th Ed. ist an dieser Stelle etwas düster, da nur Chrome, IE9pre3 und Safari/Firefox Nightlies dies unterstützen.

+0

Grund für die Abstimmung unten? – Anurag

+0

+1, ich sehe keinen Grund für einen Downvote. BTW, IE9pre3 unterstützt es auch. – CMS

+0

danke @CMS, es ist gut zu sehen, IE auf den Zehen mit v9. Aktualisierte Antwort – Anurag

1

Diese Funktion empfängt ein beliebiges Objekt und gibt den Namen des Prototyps, eine Liste mit allen Methoden und ein Objekt mit dem Namen seiner Eigenschaften (und deren Typen) zurück. Ich habe nicht die Möglichkeit, es in einem Browser zu testen, aber es funktioniert mit Nodejs (v0.10.24).

function inspectClass(obj) {  
    var objClass, className; 
    var classProto; 
    var methods = []; 
    var attributes = {}; 
    var t, a; 
    try { 
     if (typeof(obj) != 'function') { 
      objClass = obj.constructor; 
     } else { 
      objClass = obj;  
     } 
     className = objClass.name; 
     classProto = objClass.prototype   
     Object.getOwnPropertyNames(classProto).forEach(function(m) { 
      t = typeof(classProto[m]); 
      if (t == 'function') { 
       methods.push(m); 
      } else { 
       attributes[m] = t; 
      }  
     }); 
    } catch (err) { 
     className = 'undefined'; 
    } 
    return { 'ClassName' : className, 
      'Methods' : methods, 
      'Attributes' : attributes 
    } 
} 

Beispiel (mit NodeJS):

console.log(inspectClass(new RegExp("hello"))); 

Output:

{ ClassName: 'RegExp', 
    Methods: [ 'constructor', 'exec', 'test', 'toString', 'compile' ], 
    Attributes: 
    { source: 'string', 
    global: 'boolean', 
    ignoreCase: 'boolean', 
    multiline: 'boolean', 
    lastIndex: 'number' } } 

Die folgenden Beispiele auch mit NodeJS arbeiten:

console.log(inspectClass(RegExp)); 
console.log(inspectClass("hello")); 
console.log(inspectClass(5)); 
console.log(inspectClass(undefined)); 
console.log(inspectClass(NaN)); 
console.log(inspectClass(inspectClass)); 
0

Ein einzeiliges Lösung

Object.getOwnPropertyNames(JSON).filter(function(name){ return 'function' === typeof JSON[name]; }) 

[ 'Parse', 'stringify']

Object.getOwnPropertyNames(String).filter(function(name){ return 'function' === typeof String[name]; }) 

[ 'fromCharCode', 'fromCodePoint', 'roh']

Object.getOwnPropertyNames(Array).filter(function(name){ return 'function' === typeof Array[name]; }) 

['isArray', 'from', 'of']

Verwandte Themen