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

时间:2008-09-30 10:09:59

标签: javascript

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

7 个答案:

答案 0 :(得分:80)

不确定

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

答案 1 :(得分:15)

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

该方法不是很准确,但它非常快:

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

答案 2 :(得分:6)

这是JS reflection上的帖子。它应该做你想要的。

答案 3 :(得分:4)

这是一个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])。

答案 4 :(得分: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将不起作用。

答案 5 :(得分:1)

来自here

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

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

只需将“导航器”替换为您感兴趣的任何对象,您就应该好好去。

如安东尼在评论部分所述 - 这会返回所有属性,而不仅仅是所要求的问题。

糟糕!这会教我尝试用我不认识的语言回答问题。不过,我认为代码很有用 - 只是没有要求。

答案 6 :(得分:0)

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