2010-06-19 53 views
0

说我买了一些公共方法,此单对象和一个私有方法:如何在JavaScript中实现before_filter回调?

var QuestionFactory = (function() { 

// private method 
function google_it_first() { ... } 

// public methods 
return { 
    ask_a_stupid_question:    function() { ... }, 
    ask_a_relatively_non_stupid_question: function() { ... }, 
    ask_a_difficult_question:    function() { ... } 
} 

})(); 

我希望能够做的就是先调用google_it_first方法,在任何公开的方法被调用。如何在没有在每个公共方法内明确调用它的情况下实现它?

回答

2
function wrapper() { 
    return function() { 
    google_it_first(); 
    return arguments[0](arguments.slice(1,arguments.length); 
    } 
} 

ask_a_stupid_question: wrapper(function() { ... }) 

在我的头顶,我认为这会奏效。

+1

+1这也是我的第一个想法,只需注意'arguments'不幸是一个*真实数组*对象,您需要使用'call'在'Array.prototype'对象上调用'slice'方法。例如:'var args = Array.prototype.slice.call(arguments,1);',你也可以使用apply来调用包装函数并分别发送参数。 'arguments [0] .apply(null,args);' – CMS 2010-06-20 05:24:14

+0

也许我不理解它,但似乎我不得不在每种方法上使用包装函数。就代码重复而言,与在每个方法中调用google_it_first()相同。那有什么意义? – snitko 2010-06-20 22:31:56

+0

是的,你必须这样做。事情是你可以添加尽可能多的函数包装,而不必改变它的所有方法。我会辩论这种机制在重复方面完全不同,因为它仍然将方面/关注区分开来。关键是,这就是JavaScript的工作原理。无论如何,rails中的Before_filters都是在请求系统中实现的,而不是在方法级别实现的。 – 2010-06-20 23:25:08