我试图从类中描述的方法返回实例化对象,但我唯一得到的是对类的引用,而不是实例
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对象,我该怎样才能实现呢?
答案 0 :(得分:0)
您的版本不起作用,因为b
只是一个普通的旧函数而@
(AKA this
)通常取决于函数的调用方式:如果调用函数为一个函数,然后@
通常是window
。
有很多方法可以解决这个问题:
旧的self = this
技巧也适用于CoffeeScript:
self = @
b = -> console.log(self)
b()
这要求您谈谈self
而不是@
。这种方法似乎没有以前那么常见。
您可以使用本机Function.protype.bind
函数创建绑定函数:
b = (-> console.log(@)).bind(@)
b()
Function.prototype.bind
为您提供了另一个始终具有所需@
的功能。
您可以使用CoffeeScript的fat arrow (=>
)创建绑定函数,而不是通常的瘦箭头(->
):
b = => console.log(@)
b()
这与使用Function.prototype.bind
具有相同的效果。这可能是在CoffeeScript中执行此类操作的最常用方法。
使用Function.prototype.call
或Function.prototype.apply
调用此功能时指定所需的@
:
b = -> console.log(@)
b.call(@) # or b.apply(@)
您使用哪种方法取决于您的具体情况。
答案 1 :(得分:0)
我认为这个例子可以说你的陷阱
class A
a: false
b: -> alert @.a
yoyo = new A
yoyo.a = true
yoyo.b()
如果@
是class A
而不是yoyo实例变量,那么yoyo.b会告诉你总是假的。但是你可以通过link