如何使用CoffeeScript中的类设置对象属性

时间:2014-03-12 18:33:09

标签: class properties coffeescript instance

我正在尝试编写一个程序,它接受一个数字并根据Luhn公式对其进行验证。

如何在CoffeeScript中设置类中的对象属性?我想这样做:

class Luhn
  constructor: (@number)  ->

  lastDigit: @number % 10

但这会产生:

function Luhn(number) {
  this.number = number;
}

Luhn.prototype.checkDigit = Luhn.number % 10;

返回undefined,因为它正在尝试访问类变量。

设置原型时,您可以这样做:

function Luhn(number) {
  this.number = number;
}

Luhn.prototype.lastDigit = function() {
  return this.number % 10
}

现在Luhn类的一个实例有一个有效的函数lastDigit()

有没有办法在CoffeeScript中设置类中的对象属性?我知道我可以在构造函数中设置它,如下所示:

class Luhn
  constructor: (@number)  ->
    @lastDigit: @number % 10

但我想设置其他更复杂的属性,我不希望我的构造函数变得混乱。这是一个想法,但它仍然有点糟糕:

class Luhn
  constructor: (@number)  ->
    @lastDigit: @number % 10
    @complicatedProperty1 = getComplicatedProperty1(@number)
    @complicatedProperty2 = getComplicatedProperty2(@number)

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

将它们设置在constructor中,这是您有实例使用的唯一地方。

或者,使用方法而不是简单属性:

class Luhn
  constructor: (@number)  ->

  lastDigit: -> @number % 10

或:

class Luhn
  constructor: (@number)  ->

  lastDigit: -> @number % 10

  complicatedProperty1: ->
    @_complicatedProperty1 ?= getComplicatedProperty1(@number)

complicatedProperty1内的缓存假定@number不会更改,getComplicatedProperty1(@number)将不会返回nullundefined

CoffeeScript类实际上不是C风格的struct,因此将所有内容作为普通属性公开并不是最好的想法。如果您只需要轻松访问这些属性,那么请提供toJSONserialize方法,而不会让您的内部因意外修改:

toJSON: ->
  number: @number
  lastDigit: @lastDigit()
  complicatedProperty1: @complicatedProperty1()

我使用toJSON作为名称,JSON.stringify会在尝试对对象进行字符串化时调用该方法:

  

如果要进行字符串化的对象具有名为toJSON的属性,其值为函数,则toJSON方法会自定义JSON字符串化行为:而不是要序列化的对象,{{返回的值} 1}}调用时的方法将被序列化。

所以toJSON是(Coffee | Java)Script中序列化函数的自然名称。