我想知道如何列出一个对象可用的所有方法,例如:
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, …
当前回答
如果你想要包括继承方法在内的所有方法:
函数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(数学));
其他回答
受到其他答案的启发,这里有一种查找所有方法的递归方法:
// Find all methods of an object, up to the root prototype
function findAllMethods(obj, methods = []) {
if (!obj) {
return [...new Set(methods)];
}
const props = Object.getOwnPropertyNames(obj);
return findAllMethods(Object.getPrototypeOf(obj), [
...methods,
...props.filter(prop => typeof obj[prop] === 'function'),
]);
}
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”、“实验”、“量化”,“随机”,“圆”,“地板”,“治疗”,“世界”,“分”,“罪”)在任何特定的顺序。
如果你想要包括继承方法在内的所有方法:
函数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(数学));
我相信有一个简单的历史原因,为什么你不能列举 使用内置对象的方法,例如Array。原因如下:
方法是prototype-object的属性,比如Object.prototype。 这意味着所有object实例都将继承这些方法。这是 为什么你可以在任何对象上使用这些方法。例如,使用. tostring()。
所以IF方法是可枚举的,我将遍历{a:123} 使用:"for(输入{a:123}){…会发生什么?多少次 循环会被执行吗?
在我们的例子中,对于单个键“a”,它将被迭代一次。但也 Object.prototype的每个可枚举属性一次。因此,如果 方法是可枚举的(默认情况下),那么在任何对象上的任何循环都将循环 对所有继承的方法也是如此。