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

80

有没有一种方法可以在JavaScript中打印对象的所有方法?

6个回答

102

当然:

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
try/catch是一个不错的方法。在IE中有一些属性/方法会在访问时出错。 - scunliffe
是的,我认为 Firefox 也有一些。 - troelskn
3
请注意,它不适用于一些内置对象,如Date:var a = new Date(); console.log(typeof a, getMethods(a));返回:object [] - FGM
对于 Date,这个方法适用于我:Object.getOwnPropertyNames(Date.prototype) - Aakash

25

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

这种方法不是非常准确,但确实非常快:

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

7
为什么执行 Object.keys(new Date()); 会返回一个空数组? - Old Geezer
@old-geezer 这将返回所有日期方法,Object.getOwnPropertyNames(Date.prototype).join("\n") - vikkee

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])。


2
这很有用!一个更正:在函数内应该使用obj而不是this - thecodesmith_

3

看一下这段代码:

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上不起作用。


1

这里开始:

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

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

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

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

糟糕!这将教训我尝试用我不懂的语言回答问题。不过,我认为代码还是有用的-只是不是所需内容。


这将返回所有属性,而不仅仅是问题所要求的方法。在IE上,它只返回一些属性和没有方法。 - AnthonyWJones

0

由于JavaScript中的方法只是函数属性,因此for..in循环将枚举它们,但有一个例外-它不会枚举内置方法。据我所知,没有办法枚举内置方法。您也无法声明自己的方法或属性,以使对象不能以这种方式枚举。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接