在自己的类方法中获取对实例化对象的引用?

时间:2014-12-13 19:12:55

标签: methods coffeescript instance

我试图从类中描述的方法返回实例化对象,但我唯一得到的是对类的引用,而不是实例

class A 
  a: ()->
    console.log(@)
    b=()-> console.log(@)
    b()
  c: ()=>
  console.log(@)

yoyo = new A
yoyo.a()
yoyo.c()

它返回:

A {c: function, a: function}
Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
A {c: function, a: function}

但是我想要归还yoyo对象,我该怎样才能实现呢?

2 个答案:

答案 0 :(得分:0)

您的版本不起作用,因为b只是一个普通的旧函数而@(AKA this)通常取决于函数的调用方式:如果调用函数为一个函数,然后@通常是window

有很多方法可以解决这个问题:

  1. 旧的self = this技巧也适用于CoffeeScript:

    self = @
    b = -> console.log(self)
    b()
    

    这要求您谈谈self而不是@。这种方法似乎没有以前那么常见。

  2. 您可以使用本机Function.protype.bind函数创建绑定函数:

    b = (-> console.log(@)).bind(@)
    b()
    

    Function.prototype.bind为您提供了另一个始终具有所需@的功能。

  3. 您可以使用CoffeeScript的fat arrow (=>)创建绑定函数,而不是通常的瘦箭头(->):

    b = => console.log(@)
    b()
    

    这与使用Function.prototype.bind具有相同的效果。这可能是在CoffeeScript中执行此类操作的最常用方法。

  4. 使用Function.prototype.callFunction.prototype.apply调用此功能时指定所需的@

    b = -> console.log(@)
    b.call(@) # or b.apply(@)
    
  5. 您使用哪种方法取决于您的具体情况。

答案 1 :(得分:0)

我认为这个例子可以说你的陷阱

class A
  a: false
  b: -> alert @.a

yoyo = new A
yoyo.a = true
yoyo.b()

如果@class A而不是yoyo实例变量,那么yoyo.b会告诉你总是假的。但是你可以通过link

来试试