我正在尝试编写一个程序,它接受一个数字并根据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)
最好的方法是什么?
答案 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)
将不会返回null
或undefined
。
CoffeeScript类实际上不是C风格的struct
,因此将所有内容作为普通属性公开并不是最好的想法。如果您只需要轻松访问这些属性,那么请提供toJSON
或serialize
方法,而不会让您的内部因意外修改:
toJSON: ->
number: @number
lastDigit: @lastDigit()
complicatedProperty1: @complicatedProperty1()
我使用toJSON
作为名称,JSON.stringify
会在尝试对对象进行字符串化时调用该方法:
如果要进行字符串化的对象具有名为
toJSON
的属性,其值为函数,则toJSON
方法会自定义JSON字符串化行为:而不是要序列化的对象,{{返回的值} 1}}调用时的方法将被序列化。
所以toJSON
是(Coffee | Java)Script中序列化函数的自然名称。