代码之家  ›  专栏  ›  技术社区  ›  Fabien

有没有一种方法可以用javascript打印一个对象的所有方法?

  •  60
  • Fabien  · 技术社区  · 16 年前

    有没有一种方法可以用javascript打印一个对象的所有方法?

    7 回复  |  直到 6 年前
        1
  •  79
  •   troelskn    16 年前

    当然:

    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"));
    
        2
  •  11
  •   mrded    7 年前

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

    该方法不太准确,但速度非常快:

    console.log(Object.keys(obj));
    
        3
  •  6
  •   Oli    16 年前

    这是一个帖子 JS reflection . 它应该做你想要的。

        4
  •  4
  •   Novaterata    6 年前

    这里是一个 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默认参数,可以传入对象,或者默认为 this .

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

    (param) => ... 是ES6箭头函数,它是

    function(param) {
        return ...
    }
    

    隐式返回。

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

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

        5
  •  3
  •   AnthonyWJones    16 年前

    在这条准则下采取行动:

    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对象)上使用它,那么它将无法工作。

        6
  •  1
  •   WalkingRandomly    16 年前

    here :

    示例1:此示例写出“navigator”对象的所有属性及其值:

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

    只需将“导航器”替换为您感兴趣的任何对象,就可以了。

    正如安东尼在评论部分提到的,这将返回所有属性,而不仅仅是问题所要求的方法。

    哎呀!这会教我用一种我不懂的语言来回答问题。不过,我认为代码是有用的-只是不是所需的。

        7
  •  0
  •   Neall    16 年前

    因为javascript中的方法只是函数的属性,所以for..in循环将枚举它们,但有一个例外——它不会枚举内置方法。据我所知,无法枚举内置方法。并且不能在不可枚举的对象上声明自己的方法或属性。