1

我有以下代码:

class Number
 number = null
 constructor: (num) ->
  number = num
 getNumber: -> number

class Sequence
 numbers = []
 constructor: ->

 addNumber: (n) ->
  numbers.push new Number n

 displaySequence: ->
  for number in numbers
   alert number.getNumber()

seq = new Sequence()
seq.addNumber 1
seq.addNumber 2
seq.displaySequence()

numbers数组seq应该包含 2 个值为 1 和 2的Number对象,但我得到的结果是 2 和 2 ......有人能给我一些启示吗?

4

2 回答 2

1

使用 @ 声明本地字段。

class Number
 constructor: (@num) ->
 getNumber: -> @num

class Sequence
 numbers = []
 constructor: ->

 addNumber: (n) ->
  numbers.push (new Number n)

 displaySequence: ->
  for number in numbers
   alert number.getNumber()

seq = new Sequence()
seq.addNumber 1
seq.addNumber 2
seq.displaySequence()
于 2012-09-02T14:39:31.117 回答
1

问题是您的 number 类会复制到以下 JavaScript。其中变量 number 存储在作用域中而不是 Number 函数的成员:

Number = (function() {
  // number is stored in the scope not as a member of the prototype
  var number;

  number = null;

  // this is the function that will be return
  // so when ever you call it you override number
  function Number(num) {
    number = num;
  }

  Number.prototype.getNumber = function() {
    return number;
  };

  return Number;

})();

您必须使用以下方法将要存储的数字设为类的属性@

class Number
 constructor: (@num) ->
 getNumber: -> @num

编译为:

var Number;

Number = (function() {

  function Number(num) {
    //now num is stored in the returned function not in the scope of the parent function
    this.num = num;
  }

  Number.prototype.getNumber = function() {
    return this.num;
  };

  return Number;

})();
于 2012-09-02T14:56:07.660 回答