私は最近、javascriptでmapの実装を使用して一連のアイテムを作成し、それらをオブジェクトのaddメソッドに適用しようとしました。
まず、マップの標準的な実装です。
var map = function (fn, a)
{
for (i = 0; i < a.length; i++)
{
a[i] = fn(a[i]);
}
}
設定。
var translateMenu = new Menu;
var languages = [ ['Chinese' , 'zh-CN']
, ['German' , 'de']
, ['French' , 'fr']
, ['Portugese' , 'pt']
, ['Hindi' , 'hi']
];
そして私の関数...(後でtranslateMenuをmainMenuに追加するときに使用されるため、匿名ではありません。)
var langItem = function (language, subMenu)
{
return new MenuItem(language[0], 'http://translate.google.com/translate?u=www.example.com&hl=en&ie=UTF-8&tl=en&sl=' + language[1] , "" , subMenu);
}
map ( langItem , languages );
これはすべてうまくいきました、私は今、投げるMenuItemsの配列を持っていました。
呼び出そmap( Menu.add , languages )
うとすると、Menuの内部変数が未定義になり、呼び出しが失敗します。
これはメソッドのスコープに関係していると確信しているMenu.add()
ので、オブジェクトも渡せば機能するのではないかと思いました。
オブジェクトと関数を受け入れる新しいマップ関数を作成しようとしましたが、同じ未定義のエラーが発生しました。
objMap (fn , obj , a) {
for (i = 0; i < a.length; i++)
{
obj.fn(a);
}
}
objMap ( add , translateMenu , languages ); // failed
私はこれを回避するために、addAll()を使用してMenuを拡張し、配列を取得しました。これは正常に機能します...
Menu.prototype.addAll = function (items){
for (i = 0; i < items.length; i++)
{
this.add(items[i]);
}
}
translateMenu.addAll( languages ); // yay! but I want a more elegant solution.
とにかく、私の質問は、マップされた関数としてオブジェクトメソッドの使用を実際にサポートするために、マップ(または同様のジェネリック関数)をどのように実装できますか?。