3

在 CoffeeScript 中,如果我在类构造函数中定义一个实例属性,该属性可以在其定义中引用其他实例属性,例如:

class Foo
    constructor: (data) ->

        @One = 1

        @Two = @One + 1

但是在类级别声明的实例属性呢?以下不起作用:

class Foo

    One: 1

    Two: @One + 1

在这种情况下,@ 符号指的是“类”本身,而不是实例。同样,简单地删除 @ 也不起作用。

有没有办法让在类级别声明的一个实例属性可以在其定义中引用另一个实例属性?

4

2 回答 2

4

当你这样说时:

class Foo
    one: 1

您正在设置one'Foo原型,因此您只需查看@' 原型即可返回到位置one

class Foo
    one: 1
    two: @::one + 1

演示

请注意,这甚至适用于子类,因此您可以这样做:

class Pancakes extends Foo
    three: @::two + 1

你会得到预期的三个。

于 2012-10-19T00:50:27.083 回答
1

是的,您可以为此使用辅助变量:

class Foo
  uno = 1
  One: uno
  Two: uno + 1

(变量也可以被称为One,我只是用另一个名字来区分它和属性)

但是请记住,这些属性将在 Foo 的原型中,而不是在 Foo“类”本身中。这是生成的 JS:

var Foo;

Foo = (function() {
  var uno;

  function Foo() {}

  uno = 1;

  Foo.prototype.One = uno;

  Foo.prototype.Two = uno + 1;

  return Foo;

})();

如果您希望它们成为类属性,您可以在类级别使用 @:

class Foo
  @One = 1
  @Two: @One + 1

这样你就可以访问那些 asFoo.OneFoo.Two.

于 2012-10-19T00:49:41.887 回答