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配列には、値が 1 と 2 のseq2 つのオブジェクトが含まれている必要がありますNumberが、得られる結果は 2 と 2 です...誰かが私に光を当てることができますか?

4

2 に答える 2

1

問題は、次の 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 に答える
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 に答える