我的foo.coffee
看起来像这样:
class window.Foo
bar: () ->
baz()
baz: () ->
"baz"
在谷歌Chrome控制台中,为什么我会得到以下内容?
f = new Foo
▶ Foo {}
f.baz
"baz"
f.bar
▶ Uncaught ReferenceError: baz is not defined(…)
答案 0 :(得分:2)
您需要了解类抽象的工作原理。 Foo是一个具有自己范围的函数,因此您可能认为您正在定义存在于同一范围内的内部函数。但你不是。这是(或多或少)实际生成的代码:
var Foo = function Foo() {};
Foo.prototype.bar = function() {
return baz();
};
Foo.prototype.baz = function() {
return "baz";
};
所以bar只存在于Foo的原型中。由于new
运算符在javascript中的工作方式,Foo的每个实例都获得指向该函数的指针。您可以使用this
引用这些原型函数,其中coffeescript缩写为@
。
class Foo
bar: () ->
@baz()
baz: () ->
'baz'
你可以选择(虽然它没有使用类的意思)说:
class Foo
bar: () ->
Foo.prototype.baz()
baz: () ->
'baz'
答案 1 :(得分:0)
您错过了@ sign - 对此/ self
的引用class window.Foo
bar: () ->
@baz()
baz: () ->
"baz"