Coffeescript相当于Python的getattr

时间:2011-08-31 23:36:11

标签: javascript python coffeescript

在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 个答案:

答案 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,而不是添加一层厚厚的抽象。因此,请记住以下几点:

  1. 当zeekay回答时,x[y]相当于getattr / setattr(如果undefined没有关键字{{1}的属性,则会返回x而不是抛出异常);
  2. 使用语法y附加到类的函数只是类'原型的方法,可以随时修改(或在特定实例上重写)。
  3. 运行foo: -> ...后,method = x.methodx.method()之间存在一个重要区别,即使两者都运行相同的功能:当您将函数作为method()运行时,{{ 1}}指向x.method();但当您以this运行时,x指向全局对象(浏览器中的method(),Node.js中的this)。
  4. 如果您想了解更多信息,请查看我的书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()