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

Methods 在实例化对象自己的类方法中获取对该对象的引用?,methods,coffeescript,instance,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: Wi

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

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对象,我该如何实现呢?

你的版本不起作用,因为b只是一个普通的旧函数,@AKA这通常取决于函数的调用方式:如果你将函数作为函数调用,@通常是窗口

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

old self=此技巧在CoffeeScript中也有效:

self = @
b = -> console.log(self)
b()
这要求你谈论自我,而不是“尽管”。这种方法似乎不像过去那样普遍了

可以使用本机函数创建绑定函数:

b = (-> console.log(@)).bind(@)
b()
Function.prototype.bind为您提供另一个始终具有所需@的函数

您可以使用CoffeeScript创建绑定函数,而不是通常的瘦箭头->:

这与使用Function.prototype.bind的效果相同。这可能是在CoffeeScript中做这类事情最常见的方法

使用或调用函数时指定所需的@:


您使用哪种方法取决于您的具体情况。

我认为这个例子可以说明您的问题

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

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

如果@不是类A的yoyo实例变量,那么yoyo.b将告诉您始终为false。但您可以通过

尝试此方法,所有解决方案仍然返回A对象,而不是所需实例yoyo,或者我可能遗漏了一些内容您是否用上述任何一种方法替换了A函数中的b?他们都做了你似乎要求的事情:
b = -> console.log(@)
b.call(@) # or b.apply(@)
class A
  a: false
  b: -> alert @.a

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