给定一个任意的javascript对象,我怎样才能找到它的方法?

tel*_*viv 7 javascript reflection

我知道这在python中是可能的,但是我可以获得javascript对象的方法列表吗?

Jan*_*nen 12

您可以遍历对象中的属性并测试其类型.

for(var prop in whatever) {
    if(typeof whatever[prop] == 'function') {
        //do something
    }
}
Run Code Online (Sandbox Code Playgroud)


Anu*_*rag 6

要添加到现有答案,ECMAScript第5版.提供了一种使用该方法访问对象的所有属性(甚至是不可枚举的属性)的方法Object.getOwnPropertyNames.当试图枚举本机对象的属性时,例如Math,afor..in

for(var property in Math) {
    console.log(property);
}
Run Code Online (Sandbox Code Playgroud)

将在控制台上不打印任何内容.然而,

Object.getOwnPropertyNames(Math)
Run Code Online (Sandbox Code Playgroud)

将返回:

["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"]
Run Code Online (Sandbox Code Playgroud)

您可以在此基础上编写一个辅助函数,它只返回给定对象的方法.

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"]
Run Code Online (Sandbox Code Playgroud)

支持ECMAScript第5版.在这一点上有点暗淡,因为只有Chrome,IE9pre3和Safari/Firefox nightlies支持它.