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()