Coffeescript中相当于Python的getattr
在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')
5 个回答
1
看起来答案是肯定的,但你需要在方法定义中使用粗箭头操作符:
class O
method2 =>
console.log(this)
如果我理解得没错,这种语法是告诉CoffeeScript把实例绑定到这个方法上,这样就可以从实例外部调用它。如果你使用细箭头,CoffeeScript就不会记录绑定的信息,这样如果你不通过实例来调用这个方法,JavaScript中的this
就会指向一些意想不到的东西。
class O
method2 ->
console.log(this)
2
CoffeeScript中的对象和类跟Python里的用法差别很大。这可能会让人感到困惑,但CoffeeScript的目标是尽量贴近JavaScript,而不是增加复杂的抽象层。所以,有几个要点需要记住:
- 正如zeekay所说,
x[y]
相当于Python中的getattr
和setattr
(不同的是,如果x
没有y
这个属性,它会返回undefined
,而不是抛出异常); - 你用
foo: -> ...
这种语法添加到类中的函数,其实就是类原型的方法,可以随时修改(或者在某个特定的实例上覆盖); - 当你运行
method = x.method
后,x.method()
和method()
之间有一个重要的区别,尽管它们运行的是同一个函数:当你用x.method()
来调用时,this
指向x
;但当你用method()
来调用时,this
指向的是全局对象(在浏览器中是window
,在Node.js中是global
)。
如果你想了解更多,可以看看我的书,《CoffeeScript: Accelerated JavaScript Development》。:)
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()