0

我有一个称为选项的哈希。我面临的问题是它options['beforeOpen']可能已经是一个函数,在这种情况下我不想覆盖它。我想改为调用它,然后调用另一个每次都需要调用的函数

在这个例子中,每次都需要调用的方法是methodThatINeedToDo. 我认为下面的代码可以完成此操作,但它没有按我预期的那样工作。

function methodThatINeedToDo(){alert('maintenance');}

var options = {beforeOpen: function(){alert('first');}} 
if(typeof options['beforeOpen'] == "function"){
    options['beforeOpen'] = function(){options['beforeOpen'].call(); methodThatINeedToAddToDo();}
} else {
    options['beforeOpen'] = methodThatINeedToDo;
}
4

4 回答 4

2

问题是你定义的函数中 override options['beforeOpen'],你正在使用options['beforeOpen'],到那时它已经被覆盖了!

您需要缓存它并在新函数中使用缓存的值:

var cachedBeforeOpen = options.beforeOpen;

if (typeof cachedBeforeOpen == "function") {
  options.beforeOpen = function() {
    cachedBeforeOpen.call();
    methodThatINeedToDo();
  };
} else {
  options.beforeOpen = methodThatINeedToDo;
}
于 2013-06-18T15:50:39.800 回答
1

只需始终调用methodThatINeedToDo,因为您想要并在那里检查是否应该调用您的选项方法:

function methodThatINeedToDo(){
  options.beforeOpen && options.beforeOpen();
  alert('maintenance');
}
于 2013-06-18T15:50:55.080 回答
1

这真的闻起来像错误的解决方案。为什么不发布/订阅模式

这是一个小例子:http: //jsfiddle.net/ajyQH/

$(function() {

var yourObj = { yourFct : [] };


$('#btn').click(function() {
    yourObj.yourFct.push(function() {
        $('#testibert').append($('<p>').text('hallo'));
    });
});

$('#btn_exec').click(function() {
    var len = yourObj.yourFct.length;
    for(var i = 0; i < len; i++) {
      yourObj.yourFct[i]();
    }
});
});
于 2013-06-18T15:53:45.970 回答
0
var oldCall = options['beforeOpen'];
var newCall = function(){
 oldCall(); 
 methodThatINeedToAddToDo();
};
options['beforeOpen'] = newCall;
于 2013-06-18T15:49:23.180 回答