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 回答