如何获得对象的方法?


Answers:


70
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}

2
for..in方法是标准的做法。
Makram Saleh

1
克里斯,谢谢您的编辑!我认为您喜欢TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
朱利安·F·韦纳特

现在,代码已用方括号固定。抱歉给你带来不便。
Makram Saleh 2013年

为了方便起见,添加了对数组进行排序的功能。
SomeGuyOnAComputer 2015年

如果评估条件,有什么区别m instanceof Function吗?
何塞

46

请记住,从技术上讲javascript对象没有方法。它们具有属性,其中一些可能是函数对象。这意味着您可以枚举对象中的方法,就像枚举属性一样。这(或与此类似的东西)应该工作:

var bar
for (bar in foo)
{
    console.log("Foo has property " + bar);
}

这有一些复杂性,因为对象的某些属性不可枚举,因此您将无法找到对象上的每个函数。


2
也许他在谈论console.log。谢谢。
thom

2
是的,我不是每天都做JS,所以我不是100%精通它。但我听得懂的语言..
ReinstateMonica拉里·奥斯特曼

27

您可以console.dir(object)用来将对象属性写入控制台。


17

在现代浏览器中,您可以Object.getOwnPropertyNames用来获取对象的所有属性(可枚举和不可枚举)。例如:

function Person ( age, name ) {
    this.age = age;
    this.name = name;
}

Person.prototype.greet = function () {
    return "My name is " + this.name;
};

Person.prototype.age = function () {
    this.age = this.age + 1;
};

// ["constructor", "greet", "age"]
Object.getOwnPropertyNames( Person.prototype );

请注意,这只会检索own-properties,因此不会返回原型链其他位置找到的属性。但是,这似乎不是您的要求,因此我认为这种方法已经足够。

如果您只想查看可枚举的属性,则可以使用Object.keys。这将返回相同的集合,减去不可枚举的constructor属性。


6

可以使用浏览器的开发人员工具(F12)在对象的原型链中检查这些方法:

  console.log(yourJSObject);

或更直接

  console.dir(yourJSObject.__proto__);

4

在ES6中:

let myObj   = {myFn : function() {}, tamato: true};
let allKeys = Object.keys(myObj);
let fnKeys  = allKeys.filter(key => typeof myObj[key] == 'function');
console.log(fnKeys);
// output: ["myFn"]

4

对我来说,获取最终扩展类的方法的唯一可靠方法是这样做:

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}

2
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.push(name)
    }
}

我的电话没有半冒号:),但这是一般的想法。


4
什么电话没有分号,但可以让您回答问题?大声笑
霍根

我想一部新手机就是冒号您的名字!
Redwolf节目

1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

您可以简单地遍历构造函数的原型并提取所有方法。


这不会考虑直接附加到对象的方法
Matt Greer

@MattGreer他的示例在构造函数上调用了一个方法。他是否需要构造函数或对象的方法是另一回事。
雷诺斯2011年



0

获取方法名称:

var getMethodNames = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    }));
};

或者,获取方法:

var getMethods     = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    })).map(function (key) {
        return obj[key];
    });
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.