如何显示对象的所有方法?

2022-08-30 00:09:50

我想知道如何列出对象可用的所有方法,例如:

 alert(show_all_methods(Math));

这应该打印:

abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, …

答案 1

可以使用 Object.getOwnPropertyNames() 获取属于某个对象的所有属性,无论这些属性是否可枚举。例如:

console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]

然后,您可以使用 filter() 仅获取以下方法:

console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
    return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]

在 ES3 浏览器(IE 8 及更低版本)中,内置对象的属性不可枚举。对象不是内置的,它们由浏览器定义,并且很可能通过设计进行枚举。windowdocument

来自 ECMA-262 第 3 版

全局对象
有一个唯一的全局对象 (15.1),它是在控件进入任何执行上下文之前创建的。最初,全局对象具有以下属性:

•内置对象,如数学,字符串,日期,parseInt等,这些都有属性{DontEnum}
• 其他主机定义的属性。这可能包括其值为全局对象本身的属性;例如,在 HTML 文档对象模型中,全局对象的窗口属性是全局对象本身。

当控件进入执行上下文和执行 ECMAScript 代码时,可能会向全局对象添加其他属性,并且可以更改初始属性。

我应该指出,这意味着这些对象不是 Global 对象的可枚举属性。如果您浏览规范文档的其余部分,您将看到这些对象的大多数内置属性和方法都设置了特性。{ DontEnum }


更新:SO用户CMS引起了我的注意,这是一个关于{DontEnum}的IE错误

[Microsoft] JScript 不会检查 DontEnum 属性,而是跳过任何对象中的任何属性,其中对象的原型链中存在具有属性 DontEnum 的同名属性。

简而言之,在命名对象属性时要小心。如果存在具有相同名称的内置原型属性或方法,则 IE 在使用循环时将跳过它。for...in


答案 2

这在 ES3 中是不可能的,因为属性具有内部属性,这会阻止我们枚举这些属性。另一方面,ES5 提供了用于控制属性枚举功能的属性描述符,以便用户定义属性和本机属性可以使用相同的接口并享受相同的功能,其中包括能够以编程方式查看不可枚举的属性。DontEnum

该函数可用于枚举传入对象的所有属性,包括不可枚举的属性。然后可以使用简单的检查来过滤掉非函数。不幸的是,Chrome是目前唯一可以使用的浏览器。getOwnPropertyNamestypeof

​function getAllMethods(object) {
    return Object.getOwnPropertyNames(object).filter(function(property) {
        return typeof object[property] == 'function';
    });
}

console.log(getAllMethods(Math));

日志没有特定的顺序。["cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"]