例えば、あるオブジェクトで利用可能なすべてのメソッドをリストアップする方法を知りたい。
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`のようなオブジェクトはビルトインではなく、ブラウザによって定義されており、おそらく設計上、列挙可能になっています。
ECMA-262 Edition 3]1より。
グローバルオブジェクト</br
一意のグローバル オブジェクト(15.1)があります。 固有のグローバルオブジェクト(15.1)があり、制御が実行コンテキストに入る前に作成される。 初期状態では、グローバルオブジェクトは以下のプロパティを持っています。 初期状態では以下のプロパティを持っています。
- 組み込み Math、String、Dateなどのオブジェクトが組み込まれています。 parseInt などの組み込みオブジェクト。これらは属性{ DontEnum }.
- 追加のホスト定義 プロパティ。これには 値がグローバル オブジェクト自体を値とするプロパティが含まれる場合があります。 例えば、HTML文書オブジェクトモデルでは、ウィンドウ グローバルオブジェクトの> プロパティは 例えば、HTML文書オブジェクトモデルでは、グローバルオブジェクトのwindow > プロパティは、グローバルオブジェクト自体です。
制御が 実行コンテクストに入り、また ECMAScriptコードが実行されます。 プロパティが追加されることがあります。 グローバルオブジェクトにプロパティが追加されたり、初期の プロパティを変更することができます。
これは、それらのオブジェクトがGlobalオブジェクトの列挙可能なプロパティではないことを意味することを指摘しておきます。 仕様書の残りの部分に目を通すと、これらのオブジェクトの組み込みプロパティやメソッドのほとんどに、{ DontEnum }
属性が設定されていることがわかります。
更新:SOユーザーのCMSさんが、IEの{ DontEnum }
に関するバグを私に知らせてくれました。
DontEnum属性をチェックする代わりに、[Microsoft] JScriptは、オブジェクトのプロトタイプチェーンにDontEnum属性を持つ同名のプロパティがある場合、そのプロパティをスキップします。
要するに、オブジェクトのプロパティに名前を付けるときには注意が必要です。 もし同じ名前の組み込みプロトタイププロパティやメソッドがあれば、IEはfor...in
ループを使うときにそれをスキップします。
var methods = [];
for (var m in obj) {
if (typeof obj[m] == "function") {
methods.push(m);
}
}
alert(methods.join(","));
この方法では、obj
で呼び出すことのできるすべてのメソッドを取得します。これには、そのプロトタイプから "inherits"されたメソッドも含まれます (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(","));
簡単に言うと、Math
やDate
(頭の中にあるだけで、他にもあると思いますが)は通常のオブジェクトではないので、できません。 これを確認するために、簡単なテストスクリプトを作ってみましょう。
<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>
しかし、実際にそのオブジェクトの中を見てみると、それはネイティブコードであり、列挙のために同じように公開されていないものであることがわかります。