【问题标题】:How to get an object's methods?如何获取对象的方法?
【发布时间】:2011-08-16 02:32:23
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

标签: javascript function object methods get


【解决方案1】:
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}

【讨论】:

  • for..in 方式是标准方式。
  • 感谢您的编辑,克里斯!我想你喜欢 TypeErrors...TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
  • 代码现在用方括号固定。很抱歉给您带来不便。
  • 为方便起见添加了对数组的排序。
  • 如果评估条件m instanceof Function有区别吗?
【解决方案2】:

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

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

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

【讨论】:

  • 也许他在谈论console.log。谢谢。
  • 是的,我不是每天都做 JS,所以我不是 100% 了解它。但我确实懂语言..
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    请注意,这只检索自己的属性,因此它不会返回原型链上其他地方的属性。但是,这似乎不是您的要求,所以我认为这种方法就足够了。

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

    【讨论】:

      【解决方案5】:

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

        console.log(yourJSObject);
      

      或者更直接

        console.dir(yourJSObject.__proto__);
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:
            var funcs = []
            for(var name in myObject) {
                if(typeof myObject[name] === 'function') {
                    funcs.push(name)
                }
            }
            

            我正在使用没有分号的电话 :) 但这是一般的想法。

            【讨论】:

            • 哪款手机没有分号却可以回答问题?哈哈
            • 我认为新手机是冒号你的名字!
            【解决方案9】:
            var methods = [];
            for (var key in foo.prototype) {
                if (typeof foo.prototype[key] === "function") {
                     methods.push(key);
                }
            }
            

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

            【讨论】:

            • 这不会考虑直接附加到对象的方法
            • @MattGreer 他的示例在构造函数上调用了一个方法。他是想要来自构造函数还是对象的方法是另一回事。
            【解决方案10】:

            最好的办法是:

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

            仅在 es6 中使用 'let',改为使用 'var'

            【讨论】:

            • 它返回一个属性列表。
            • 正如 Ali 所暗示的,这不包括在类(方法)上定义为 getter/setter 的函数。
            【解决方案11】:

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

            见:https://developer.chrome.com/devtools/docs/commandline-api#keysobject

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

            【讨论】:

              【解决方案12】:

              获取方法名称:

              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];
                  });
              };
              

              【讨论】:

                猜你喜欢
                • 2011-10-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-11-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多