我想知道如何列出一个对象的所有可用方法,比如说:
alert(show_all_methods(Math));
这应该打印出来:
abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, …
你可以使用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和更低版本),内置对象的属性是不能被列举的。 像 "window "和 "document "这样的对象并不是内置的,它们是由浏览器定义的,而且很可能在设计上是可以列举的。
全局对象 有一个唯一的全局 对象(15.1),它是在控制进入任何执行环境之前创建的。 控制进入任何执行环境之前创建。 最初,全局对象有 以下属性:
>;
- 内置 对象,如Math、String、Date、 parseInt,等等。这些都有属性 { DontEnum }。
- 额外的主机定义 属性。这可能包括一个 属性,其值是全局 对象本身;例如,在 例如,在HTML文档对象模型中,窗口 全局对象的>属性就是 全局对象本身。
>; 当控制 进入执行环境,以及当 ECMAScript代码被执行、 额外的属性可能被添加到 全局对象和初始 属性可能会被改变。
我应该指出,这意味着这些对象不是Global对象的可列举属性。 如果你翻阅规范文件的其余部分,你会看到这些对象的大多数内置属性和方法都设置了{ DontEnum }
属性。
更新:一位SO用户CMS给我带来了一个关于{ DontEnum }
的IE错误。
[微软]JScript不会检查DontEnum属性,而是跳过任何对象中的任何属性,如果该对象的原型链中有一个同名的属性具有DontEnum属性。
简而言之,在命名你的对象属性时要小心。 如果有一个内置的原型属性或方法具有相同的名称,那么在使用for...in
循环时,IE将跳过它。
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(","));
简短的回答是不能,因为 "数学 "和 "日期"(在我的脑海中,我肯定还有其他对象)不是正常对象。 要看到这一点,创建一个简单的测试脚本:
<html>
<body>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
alert("Math: " + Math);
alert("Math: " + Math.sqrt);
alert("Date: " + Date);
alert("Array: " + Array);
alert("jQuery: " + jQuery);
alert("Document: " + document);
alert("Document: " + document.ready);
});
</script>
</body>
</html>
你可以看到它呈现为一个对象,与文档的整体方式相同,但当你实际尝试查看该对象时,你会发现它是本地代码,而且不是以相同的方式公开枚举的。