javascript - CoffeeScript 将对象添加到数组

标签 javascript arrays object coffeescript scoping

我有以下代码:

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()

seqnumbers 数组应该包含 2 个 Number 对象,其值为 1 和 2,但我得到的结果是 2 和2...有人可以告诉我一些事情吗?

最佳答案

问题是您的数字类会编译为以下 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;

})();

关于javascript - CoffeeScript 将对象添加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12236718/

相关文章:

javascript - 在 iPython 笔记本中显示带有 JS 的 HTML 文件

java - 在java中,如何在不同数据类型的数组中创建数组

c - 为什么我在编译时得到 "warning: function returns address of local variable [-Wreturn-local-addr]"?

javascript - 单击选择列表中的选项时如何重定向用户?

java - 如何使用 DOM 解析器在此 XML 文件中添加元素?

javascript - selenium js单击元素直到文本不相等

c++ - 在函数中返回数组

Javascript 对象返回原型(prototype)

javascript - 不寻常的 javascript 对象表示法

c# - 如果(<对象> == <整数>)