如何获取对象的方法?

时间:2011-04-30 15:14:23

标签: javascript function object methods get

是否有方法或属性从对象获取所有方法?例如:

function foo() {}
foo.prototype.a = function() {}
foo.prototype.b = function() {}

foo.get_methods(); // returns ['a', 'b'];

更新:在Jquery中是否有类似的方法?

谢谢。

12 个答案:

答案 0 :(得分:64)

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

答案 1 :(得分:46)

请记住,技术上javascript对象没有方法。它们具有属性,其中一些可能是函数对象。这意味着您可以枚举对象中的方法,就像您可以枚举属性一样。这个(或接近这个)应该有效:

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

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

答案 2 :(得分:27)

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

答案 3 :(得分:12)

在现代浏览器中,您可以使用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属性。

答案 4 :(得分:6)

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

  console.log(yourJSObject);

或更直接

  console.dir(yourJSObject.__proto__);

答案 5 :(得分:3)

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

答案 6 :(得分:2)

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

我在没有半冒号的手机上:)但这是一般的想法。

答案 7 :(得分:2)

最好的方法是:

let methods = Object.getOwnPropertyNames(yourobject);
console.log(methods)

仅在es6中使用'let',而使用'var'代替

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

在Chrome中keys(foo.prototype)。返回["a", "b"]

请参阅:https://developer.chrome.com/devtools/docs/commandline-api#keysobject enter image description here

稍后编辑:如果您需要快速复制(对于较大的对象),请执行copy(keys(foo.prototype)),然后将其放入剪贴板。

答案 11 :(得分: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];
    });
};