関数を JavaScript オブジェクトのキーとして使用したいと思います。少なくともChromeでは、以下が機能します。
var registry = {};
function Foo(){ };
function Bar(){ };
registry[Foo] = 42;
registry[Bar] = 43;
alert(registry[Foo] + " < " + registry[Bar]);
これは標準でカバーされていますか?どのブラウザでサポートされていますか?
関数を JavaScript オブジェクトのキーとして使用したいと思います。少なくともChromeでは、以下が機能します。
var registry = {};
function Foo(){ };
function Bar(){ };
registry[Foo] = 42;
registry[Bar] = 43;
alert(registry[Foo] + " < " + registry[Bar]);
これは標準でカバーされていますか?どのブラウザでサポートされていますか?
角かっこの間に入れたものはすべて文字列に変換されます。これは、関数、日付、正規表現を入れても発生します...つまり、実際には次のようなオブジェクトを作成しています。
var registry = {
"function Foo(){ }" : 42,
"function Bar(){ }" : 43
};
これはデフォルトの動作で、IE でも機能します。これは、John Resig の有名なaddEvent
役職で実際に悪用されました。
ECMAScript 5.1 - セクション 11.2.1:
生産性
MemberExpression : MemberExpression [ Expression ]
は次のように評価されます。
- baseReference を MemberExpression の評価結果とします。
- baseValue を GetValue(baseReference) とします。
- propertyNameReference を Expression の評価結果とします。
- propertyNameValue を GetValue(propertyNameReference) とします。
- CheckObjectCoercible(baseValue) を呼び出します。
- propertyNameString を ToString(propertyNameValue) とします。
- 評価されている構文生成が厳密モードのコードに含まれている場合は、strict を true にします。そうでない場合は、strict を false にします。
- 基本値が base Value で、参照名が propertyNameString で、strict モード フラグが strict である Reference 型の値を返します。
したがって、を使用obj[whatever]
するwhatever
と、文字列に変換されます。関数の場合、これは関数のソースコードを含む文字列になります。
例:
js> var func = function() { return 'hi'; };
js> function helloworld() { return 'hello world'; }
js> var obj = {};
js> obj[func] = 123;
js> obj[helloworld] = 456;
js> obj
({'function () {\n return "hi";\n}':123,
'function helloworld() {\n return "hello world";\n}':456
})