2014-03-12 66 views
0

我正在嘗試編寫一個程序,它需要一個數字並根據Luhn公式對其進行驗證。如何使用CoffeeScript中的類設置對象屬性

如何在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

將它們設置在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字串化行爲:代替對象被序列化,由toJSON方法返回的值當被調用時會被序列化。

so toJSON是(Coffee | Java)腳本中序列化函數的自然名稱。