在python中我可以在运行时将函数放入变量,然后使用getattr函数调用它
method = getattr(self,self.name)
method()
在Coffeescript中有类似的方法吗? 谢谢!
使用zeekay建议但使用类将是:
class Test
foo: -> alert 'foo'
foo2: methodName -> this[methodName]()
x = new Test
x.foo2('foo')
答案 0 :(得分:11)
在Javascript对象中是关联数组,您可以使用属性名称作为键来访问属性/方法:
obj =
method: -> 'xxx'
method = obj['method']
method() # 'xxx'
您的更新示例不起作用,因为foo2
仅返回foo
。你可能想试试这个:
class Test
foo: -> alert 'foo'
foo2: -> this['foo']() # or @['foo']()
x = new Test
x.foo2()
答案 1 :(得分:2)
CoffeeScript中的对象和类与它们在Python中的工作方式有很大不同。这可能令人沮丧,但CoffeeScript的目标是尽可能接近JavaScript,而不是添加一层厚厚的抽象。因此,请记住以下几点:
x[y]
相当于getattr
/ setattr
(如果undefined
没有关键字{{1}的属性,则会返回x
而不是抛出异常); y
附加到类的函数只是类'原型的方法,可以随时修改(或在特定实例上重写)。foo: -> ...
后,method = x.method
和x.method()
之间存在一个重要区别,即使两者都运行相同的功能:当您将函数作为method()
运行时,{{ 1}}指向x.method()
;但当您以this
运行时,x
指向全局对象(浏览器中的method()
,Node.js中的this
)。如果您想了解更多信息,请查看我的书CoffeeScript: Accelerated JavaScript Development。 :)
答案 2 :(得分:1)
您的foo2
会返回foo
方法,而不是调用它。变化
return this['foo'];
为:
this['foo']();
答案 3 :(得分:1)
看起来这是肯定的,但您必须在方法定义中使用胖箭头运算符:
class O
method2 =>
console.log(this)
如果我理解正确,那么该语法告诉coffeescript将实例绑定到方法,允许从实例外部调用它。如果您使用精简箭头,则coffeescript会不跟踪绑定信息,如果您不通过实例调用该方法,则会导致Javascript指向this
处于意外的位置。
class O
method2 ->
console.log(this)
答案 4 :(得分:1)
class Test
foo: -> alert 'foo'
foo2: -> this['foo']
当你致电x.foo2()
时,它没有做你认为正在做的事情。
-> this['foo']
此函数返回作为函数对象的this['foo']
的值。所以返回值是一个函数对象。它不运行该功能。
试试这个:
class Test
foo: -> alert 'foo'
foo2: -> this['foo']()
现在,当调用foo2()
时,它会获取funciton对象并执行它。
但是,在使用动态字符串作为访问者时,只需要括号表示法。这是完全相同的事情:
class Test
foo: -> alert 'foo'
foo2: -> @foo()