gpt4 book ai didi

javascript - 修饰 CoffeeScript 类中的函数

转载 作者:行者123 更新时间:2023-11-29 10:50:30 27 4
gpt4 key购买 nike

我正在编写一个 Backbone 应用程序,我想编写一个经过身份验证的装饰器,我可以用它来装饰路由器类中的方法(路由)列表。

所以我有一个带有几种方法的路由器,并尝试过类似的方法。但是,当我调用我想要装饰的路由时,装饰器没有附加。

class MyApp extends Backbone.Router

routes:
'' : 'home'
'foo' : 'foo'
'bar' : 'bar'


authenticated: ['foo', 'bar']

initialize: ->
@decorateAuthenticatedFunctions()

decorateAuthenticatedFunctions: =>
_.each @authenticated, (method)=>
@[method] = (args)=>
if @authorized()
@[method].apply @, args
else
@navigate '', true

authorized: =>
@user? and @user.loggedIn

foo: =>
#do stuff

bar: =>
#do stuff

我该如何解决这个问题?

最佳答案

你有几个问题。

首先,我不认为 initialize 是出于某种原因被调用的。我可以说是因为如果它被调用那么它会引发错误(见下一点)。现在我不是 Backbone 专家,但可以尝试使用构造函数吗?

class MyApp extends Backbone.Router
constructor: ->
super
@decorateAuthenticatedFunctions()

第二,那个循环不会工作。您将 @[method] 替换为一个新函数,该函数调用该函数中的 @[method]。当它成功时,你会得到一个递归无限的函数调用。因此,保存对原始函数的引用,然后使用装饰器函数调用该引用。

当您在其中时,不需要下划线,因为 CoffeeScript 可以很好地循环。而且您甚至根本不需要此循环的闭包,因为您只是立即使用循环值。

这个稍微改动过的非 Backbone 版本有效:

http://jsfiddle.net/ybuvH/2/

class MyApp

authenticated: ['foo', 'bar']

constructor: ->
@decorateAuthenticatedFunctions()

decorateAuthenticatedFunctions: =>
for method in @authenticated
fn = @[method]
@[method] = (args) =>
if @authorized()
fn.apply @, args
else
console.log 'denied'

authorized: =>
@user? and @user.loggedIn

foo: =>
console.log 'foo'

bar: =>
console.log 'bar'

app = new MyApp

app.user = { loggedIn: no }
app.foo() # denied
app.bar() # denied

app.user = { loggedIn: yes }
app.foo() # foo
app.bar() # bar​

关于javascript - 修饰 CoffeeScript 类中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11058836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com