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

时间:2020-03-06 14:54:59  来源:igfitidea点击:

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

解决方案

这是有关JS反射的文章。它应该可以满足需求。

从这里:

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

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

只需将" navigator"替换为我们感兴趣的任何对象,就可以了。

正如Anthony在评论部分中提到的那样,这不仅返回方法的所有属性,还返回所要求的问题。

糟糕!那会教我尝试用我不知道的语言回答问题。尽管如此,我认为代码是有用的,而不是必需的。

仔细看看这段代码:-

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上运行。

由于JavaScript中的方法仅仅是作为函数的属性,因此for..in循环将枚举它们,但不会枚举内置方法。据我所知,没有办法枚举内置方法。而且,我们无法在对象中声明自己无法通过这种方式枚举的方法或者属性。

当然:

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"));