我有一个名为options的哈希。我面临的问题是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;
}
答案 0 :(得分:2)
问题在于 你要定义的功能是否覆盖options['beforeOpen']
,你正在使用options['beforeOpen']
,到那时候已被覆盖了!
您需要缓存它并使用新函数中的缓存值:
var cachedBeforeOpen = options.beforeOpen;
if (typeof cachedBeforeOpen == "function") {
options.beforeOpen = function() {
cachedBeforeOpen.call();
methodThatINeedToDo();
};
} else {
options.beforeOpen = methodThatINeedToDo;
}
答案 1 :(得分:1)
只需始终致电methodThatINeedToDo
,因为您想要并在那里查看是否应该调用您的选项方法:
function methodThatINeedToDo(){
options.beforeOpen && options.beforeOpen();
alert('maintenance');
}
答案 2 :(得分:1)
真的闻起来像错误的解决方案。为什么不Publish/Subscribe pattern?
以下是一个小例子: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]();
}
});
});
答案 3 :(得分:0)
var oldCall = options['beforeOpen'];
var newCall = function(){
oldCall();
methodThatINeedToAddToDo();
};
options['beforeOpen'] = newCall;