我想知道如何列出一个对象可用的所有方法,例如:
alert(show_all_methods(Math));
这应该打印:
abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, …
我想知道如何列出一个对象可用的所有方法,例如:
alert(show_all_methods(Math));
这应该打印:
abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, …
当前回答
这在ES3中是不可能的,因为属性有一个内部的DontEnum属性,这阻止了我们枚举这些属性。另一方面,ES5提供了用于控制属性枚举功能的属性描述符,这样用户定义的属性和本机属性可以使用相同的接口并享有相同的功能,这包括能够以编程方式查看不可枚举的属性。
getOwnPropertyNames函数可用于枚举传入对象的所有属性,包括那些不可枚举的属性。然后可以使用一种简单的检查类型来过滤非函数。不幸的是,Chrome是目前唯一可以运行的浏览器。
function getAllMethods(object) {
return Object.getOwnPropertyNames(object).filter(function(property) {
return typeof object[property] == 'function';
});
}
console.log(getAllMethods(Math));
日志(“因为”、“战俘”、“日志”,“晒”,“√”,“装天花板”、“最佳”、“abs”、“max”、“实验”、“量化”,“随机”,“圆”,“地板”,“治疗”,“世界”,“分”,“罪”)在任何特定的顺序。
其他回答
大多数现代浏览器支持console.dir(obj),它将返回它通过构造函数继承的对象的所有属性。有关更多信息和当前浏览器支持,请参阅Mozilla的文档。
console.dir(Math)
=> MathConstructor
E: 2.718281828459045
LN2: 0.6931471805599453
...
tan: function tan() { [native code] }
__proto__: Object
var methods = [];
for (var m in obj) {
if (typeof obj[m] == "function") {
methods.push(m);
}
}
alert(methods.join(","));
这样,你将得到所有你可以在obj上调用的方法。这包括它从原型中“继承”的方法(如java中的getMethods())。如果你只想看到那些由obj直接定义的方法,你可以用hasOwnProperty检查:
var methods = [];
for (var m in obj) {
if (typeof obj[m] == "function" && obj.hasOwnProperty(m)) {
methods.push(m);
}
}
alert(methods.join(","));
这在ES3中是不可能的,因为属性有一个内部的DontEnum属性,这阻止了我们枚举这些属性。另一方面,ES5提供了用于控制属性枚举功能的属性描述符,这样用户定义的属性和本机属性可以使用相同的接口并享有相同的功能,这包括能够以编程方式查看不可枚举的属性。
getOwnPropertyNames函数可用于枚举传入对象的所有属性,包括那些不可枚举的属性。然后可以使用一种简单的检查类型来过滤非函数。不幸的是,Chrome是目前唯一可以运行的浏览器。
function getAllMethods(object) {
return Object.getOwnPropertyNames(object).filter(function(property) {
return typeof object[property] == 'function';
});
}
console.log(getAllMethods(Math));
日志(“因为”、“战俘”、“日志”,“晒”,“√”,“装天花板”、“最佳”、“abs”、“max”、“实验”、“量化”,“随机”,“圆”,“地板”,“治疗”,“世界”,“分”,“罪”)在任何特定的顺序。
这里的其他答案适用于Math,这是一个静态对象。但它们不适用于对象的实例,比如日期。我发现以下方法是有效的:
function getMethods(o) {
return Object.getOwnPropertyNames(Object.getPrototypeOf(o))
.filter(m => 'function' === typeof o[m])
}
//example: getMethods(new Date()): [ 'getFullYear', 'setMonth', ... ]
https://jsfiddle.net/3xrsead0/
这并不适用于原始问题(数学),所以根据你的需要选择你的解决方案。我在这里张贴这个,因为谷歌发送给我这个问题,但我想知道如何为对象的实例这样做。
如果你想要包括继承方法在内的所有方法:
函数getMethods(obj) { Const方法= []; {做 for (Object.getOwnPropertyNames(obj)的const道具){ if (obj[prop] instanceof Function) method .push(prop); } obj = Object.getPrototypeOf(obj); } while (obj !== null) 回归方法; } console.log (getMethods(数学));