需要挂钩到javascript函数调用,任何方式都可以这样做?

时间:2012-04-23 00:08:32

标签: javascript

我正试图加入一个加载Facebook新闻源的功能:

UIIntentionalStream.instance && UIIntentionalStream.instance.loadOlderPosts();

在Facebook.com上。

有没有办法让我用自己的JavaScript做到这一点?基本上,我需要进行某种回调 - 当调用该函数时,我希望调用自己的函数。

4 个答案:

答案 0 :(得分:25)

更完整的方法是:

var old = UIIntentionalStream.instance.loadOlderPosts;
UIIntentionalStream.instance.loadOlderPosts = function(arguments) {
    // hook before call
    var ret = old.apply(this, arguments);
    // hook after call
    return ret;
};

这确保如果loadOlderPosts期望任何参数或使用它,它将获得它们的正确版本以及如果调用者期望任何返回值它将获得它

答案 1 :(得分:10)

尝试这样的事情:

var old = UIIntentionalStream.instance.loadOlderPosts;
UIIntentionalStream.instance.loadOlderPosts = function() {
    // hook before call
    old();
    // hook after call
};

只需在原始函数调用之前或之后挂钩即可。

答案 2 :(得分:5)

扩展之前的帖子:我创建了一个函数,您可以调用它来执行此“挂钩”操作。

hookFunction(UIIntentionalStream.instance, 'loadOlderPosts', function(){
    /* This anonymous function gets called after UIIntentionalStream.instance.loadOlderPosts() has finished */
    doMyCustomStuff();
});



// Define this function so you can reuse it later and keep your overrides "cleaner"
function hookFunction(object, functionName, callback) {
    (function(originalFunction) {
        object[functionName] = function () {
            var returnValue = originalFunction.apply(this, arguments);

            callback.apply(this, [returnValue, originalFunction, arguments]);

            return returnValue;
        };
    }(object[functionName]));
}

额外奖励:你应该把这一切都包起来,这是好的措施。

答案 3 :(得分:2)

类似于上述Eric的回答。使用ES6时,此功能可用于异步和同步功能:

$hasher = new DefaultPasswordHasher();
$user['password'] = $hasher->hash($user['password']);