2010-07-15 19 views

回答

12

您可以遍歷對象中的屬性並測試它們的類型。

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

+1任何方式2獲取函數的參數? – deostroll 2010-07-15 04:38:36

+0

不是。所有原生JavaScript函數總是接受任意數量的參數。 – 2010-07-15 08:34:22

+0

@deostroll在一個實現toSource的瀏覽器中,現在只有firefox,你可以使用'func.toSource()。match(/ \(([^ \(\)] +)\)/)[1]'。雖然這不適用於內置函數。 – Annan 2012-11-17 19:33:34

6

要添加到現有的答案,ECMAScript第5版。提供了一種使用方法Object.getOwnPropertyNames訪問對象的所有屬性(即使是不可枚舉對象)的方法。當試圖枚舉本地對象的屬性,如Math,一個for..in

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

將打印在控制檯上什麼都沒有。然而,

Object.getOwnPropertyNames(Math) 

將返回:

["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"] 

你可以寫上這一點,只返回給定的一個對象的方法頂部的輔助功能。

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"] 

支持ECMAScript 5th ed。在這一點上有點暗淡,因爲只有Chrome,IE9pre3和Safari/Firefox的夜晚才支持它。

+0

退貨原因? – Anurag 2010-07-15 04:39:46

+0

+1,我沒有看到任何downvote的理由。順便說一句,IE9pre3也支持它。 – CMS 2010-07-15 04:46:12

+0

感謝@CMS,很高興看到它的腳趾與V9的IE瀏覽器。更新了答案。 – Anurag 2010-07-15 04:51:28

1

這個函數接收一個任意的對象並返回它的原型的名字,一個包含它所有方法的列表和一個包含它的屬性名稱(及其類型)的對象。我沒有機會在瀏覽器中測試它,但它適用於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 
    } 
} 

實施例(具有的NodeJS):

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

輸出:

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

下面的實施例也與的NodeJS工作:

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

單行溶液

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

[ '解析', '字符串化']

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

[ 'fromCharCode', 'fromCodePoint', '原始']

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

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

相關問題