3

JavaScriptで「フック」を作成したいという問題があるので、それを行うための小さな関数を作成しました。

これが私のコードです:

GoogleMaps.prototype.callUserFunc = function( func, args ){
  eval('GoogleMaps.' + func + '.apply(func, args)');
}

私が抱えている問題は、本当に eval() 関数を使用したくないということです。これを行うより良い方法はありますか?

初歩的な質問で申し訳ありませんが、私の JavaScript は少し貧弱です。

ありがとう!

4

3 に答える 3

4

角括弧表記を使用して、オブジェクトのプロパティにアクセスできます。

例:

var x = {
    someProperty: 5
};

console.log(x["someProperty"]); // => 5
console.log(x.someProperty); // => 5

var y = 'someProperty';
console.log(x[y]); // => 5

x["someProperty"]と同じですx.someProperty

このように使えます。

GoogleMaps.prototype.callUserFunc = function( func, args ){
  GoogleMaps[func].apply(func, args);
}
于 2012-11-05T16:19:36.190 に答える
3
GoogleMaps.prototype.callUserFunc = function( func, args ){
  GoogleMaps[func].apply(func, args);
  //eval('GoogleMaps.' + func + '.apply(func, args)');
}
于 2012-11-05T16:19:55.433 に答える
1

真のパススルー関数は、関数によって返された値を返し、のコンテキストで呼び出されますGoogleMaps

あなたの主な問題は、配列アクセス表記がどのオブジェクトでも使用できることを知らなかったことです。

GoogleMaps.prototype.callUserFunc = function(func, args) {
    return GoogleMaps[func].apply(GoogleMaps, args);
};

ただし、一般的には、コードを次のように記述したほうがよいでしょう。

GoogleMaps[func](...args...);

ただし、これはすべて、静的にアクセス可能な関数が含まれていることを前提としてGoogleMapsおり、オブジェクトをインスタンス化するためのコンストラクターとして使用されていません。

使用方法がわからなくてGoogleMapsも、パススルー関数callUserFuncが呼び出されているオブジェクトインスタンスから実行されている可能性があります。

GoogleMaps.prototype.callUserFunc = function(func, args) {
    return this[func].apply(this, args);
};
于 2012-11-05T16:22:41.767 に答える