Coffeescript中相当于Python的getattr

3 投票
5 回答
1441 浏览
提问于 2025-04-17 01:00

在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,而不是增加复杂的抽象层。所以,有几个要点需要记住:

  1. 正如zeekay所说,x[y]相当于Python中的getattrsetattr(不同的是,如果x没有y这个属性,它会返回undefined,而不是抛出异常);
  2. 你用foo: -> ...这种语法添加到类中的函数,其实就是类原型的方法,可以随时修改(或者在某个特定的实例上覆盖);
  3. 当你运行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()

撰写回答