【问题标题】:CoffeeScript Adding object to an arrayCoffeeScript 将对象添加到数组
【发布时间】:2012-08-27 12:47:50
【问题描述】:

我有以下代码:

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 个值为 1 和 2 的 Number 对象,但我得到的结果是 2 和 2...有人能给我一些启示吗?

【问题讨论】:

    标签: javascript arrays object coffeescript scoping


    【解决方案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;
    
    })();
    

    【讨论】:

      【解决方案2】:

      使用 @ 声明本地字段。

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

      【讨论】:

      • 那行得通。不过,我有 2 个后续问题: 1. 当您使用 constuctor: (@num) -> 时,会公开变量吗?我现在可以通过调用 Number.num 在类之外访问值 num。有没有办法让变量保持私有,访问 num 值的唯一方法是通过getNumber 方法? 2. 我的问题是什么?
      • @TríNguyễn:JavaScript 中没有私有,所以 CoffeeScript 中没有私有。您可以在class level though 私信。
      猜你喜欢
      • 2022-01-13
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多