【问题标题】:Is there a way to print all methods of an object? [duplicate]有没有办法打印对象的所有方法? [复制]
【发布时间】:2010-09-14 05:27:51
【问题描述】:

有没有办法在 JavaScript 中打印对象的所有方法?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    当然:

    function getMethods(obj) {
      var result = [];
      for (var id in obj) {
        try {
          if (typeof(obj[id]) == "function") {
            result.push(id + ": " + obj[id].toString());
          }
        } catch (err) {
          result.push(id + ": inaccessible");
        }
      }
      return result;
    }
    

    使用它:

    alert(getMethods(document).join("\n"));
    

    【讨论】:

    • try/catch 是一个很好的方法。 IE 中有一些属性/方法会在访问时出错。
    • 是的,我认为 Firefox 中也有一些。
    • 请注意,它不适用于某些内置对象,例如日期:var a = new Date(); console.log(typeof a, getMethods(a)); 返回:object []
    【解决方案2】:

    如果您只想查看对象内部的内容,可以打印所有对象的键。其中一些可以是变量,一些可以是方法。

    这个方法不是很准确,但是很快:

    console.log(Object.keys(obj));
    

    【讨论】:

    • 为什么Object.keys(new Date());给我一个空数组?
    【解决方案3】:

    这是一个ES6 示例。

    // Get the Object's methods names:
    function getMethodsNames(obj = this) {
        return Object.keys(obj)
            .filter((key) => typeof obj[key] === 'function');
    }
    
    // Get the Object's methods (functions):
    function getMethods(obj = this) {
        return Object.keys(obj)
            .filter((key) => typeof obj[key] === 'function')
            .map((key) => obj[key]);
    }
    

    obj = this是一个ES6默认参数,你可以传入一个Object或者默认为this

    Object.keys 返回Object 自己的可枚举属性的数组。 在window 对象上,它将返回[..., 'localStorage', ...'location']

    (param) => ... 是一个 ES6 箭头函数,它是的简写

    function(param) {
        return ...
    }
    

    带有隐式返回。

    Array.filter 创建一个包含所有通过测试的元素的新数组 (typeof obj[key] === 'function')。

    Array.map 创建一个新数组,其结果是对该数组中的每个元素调用提供的函数(返回 obj[key])。

    【讨论】:

    • 这很有用!更正一项:在函数内部应使用obj 而不是this
    【解决方案4】:

    看看这段代码:-

    function writeLn(s)
    {
        //your code to write a line to stdout
        WScript.Echo(s)
    }
    
    function Base() {}
    Base.prototype.methodA = function() {}
    Base.prototype.attribA = "hello"
    
    var derived = new Base()
    derived.methodB = function() {}
    derived.attribB = "world";
    
    function getMethods(obj)
    {
        var retVal = {}
    
        for (var candidate in obj)
        {
            if (typeof(obj[candidate]) == "function")
                retVal[candidate] = {func: obj[candidate], inherited: !obj.hasOwnProperty(candidate)}
        }
        return retVal
    }
    
    var result = getMethods(derived)
    for (var name in result)
    {
        writeLn(name + " is " + (result[name].inherited ? "" : "not") + " inherited")
    }
    

    getMethod 函数返回一组方法以及该方法是否是从原型继承的方法。

    请注意,如果您打算在从上下文提供的对象(例如浏览器/DOM 对象)上使用它,那么它在 IE 中不起作用。

    【讨论】:

      【解决方案5】:

      来自here

      示例 1:此示例写出“导航器”对象的所有属性,以及它们的值:

      for (var myprop in navigator){
       document.write(myprop+": "+navigator[myprop]+"<br>")
      }
      

      只需将 'navigator' 替换为您感兴趣的任何对象,您就可以开始了。

      正如 Anthony 在 cmets 部分中提到的那样 - 这会返回所有属性,而不仅仅是问题所要求的方法。

      哎呀!这将教会我尝试用我不懂的语言回答问题。不过,我认为代码很有用——只是不是所需的。

      【讨论】:

      • 这会返回所有属性,而不仅仅是问题所要求的方法。在 IE 上它只返回一些属性而不返回任何方法。
      【解决方案6】:

      由于 JavaScript 中的方法只是作为函数的属性,因此 for..in 循环将枚举它们并出现异常 - 它不会枚举内置方法。据我所知,没有办法枚举内置方法。而且您不能在无法以这种方式枚举的对象上声明自己的方法或属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-18
        • 2019-03-02
        • 1970-01-01
        相关资源
        最近更新 更多