2013-03-07 50 views
0
它們分配給對象實例

讓我們說我有這個類中的CoffeeScript:通過用戶選擇迭代和CoffeeScript的

class Human 
    constructor: (options) -> 
     if options 
      for property of options 
       opts[ property ] = options[ property ] 

    printName: -> 
     console.log 'My name is ' + opts.name 

    opts = 
     name: 'foo' 

如果我是打印出來過,我會的對象的多個實例的name屬性總是得到相同的值:

a = new Human({name: 'bob'}) 
b = new Human({name: 'john'}) 

// a.printName() -> john 
// b.printName() -> john 

但我要單獨保存每個實例的值,如:

// a.printName() -> bob 
// b.printName() -> john 

現在我知道我必須使用this.name,但是如何使用方法遍歷一長串值並將它們分配給對象實例?我不想污染這樣

constructor: (@name, @surname, @age, ...) 

回答

2

構造這應該工作:

class Human 
    constructor: (options) -> 
     @opts = default_ops 
     if options 
      for property of options 
       @opts[ property ] = options[ property ] 

    printName: -> 
     console.log 'My name is ' + @opts.name 

    default_ops = 
     name: 'foo' 
+0

如果您將@opts作爲參數傳遞給構造函數,它確實可行!謝謝 – Ozrix 2013-03-07 14:31:30

+0

我編輯了我的答案!請仔細查看變量聲明。你不需要傳遞任何'@ opts'。 – Amberlamps 2013-03-07 14:34:33

+0

這不適合我,輸出總是'約翰'。不是所有實例共享的原型? – Ozrix 2013-03-07 14:43:13

0

好,傳遞對象作爲參數構造函數作爲參考書。感謝Amber的領導。

class Human 
    DEFAULTS: 
    name: 'default name' 

    constructor: (opts = {}) -> 
    @opts = _.extend {}, @DEFAULTS, opts 

    printName: -> 
    console.log 'My name is ' + @opts.name 

BTW您可以直接將道具到:

class Human 
    constructor: (@opts, options) -> 
     if options 
      for property of options 
       @opts[ property ] = options[ property ] 

    printName: -> 
     console.log 'My name is ' + @opts.name 

    @opts = 
     name: 'foo' 
+0

這就是爲什麼你的'name'屬性沒有默認值。 'c = new Human(); c.printName()'會導致錯誤。 – Amberlamps 2013-03-07 14:51:46

+0

你應該刪除最後兩行,因爲它們是多餘的(更多的本地範圍'@ ops'首先被發現)。另外,使用'@ ops'參數是一種冒險的解決方法,因爲它從參數的值中實例化了一個實例變量。你也可以自己定義實例變量並放棄參數。 – c24w 2013-03-07 14:51:49

+0

我已經更新了我的答案! – Amberlamps 2013-03-07 14:54:57

0

可以使用從underscore一點幫助(或提供extend樣功能的任何其他LIB)寫它很容易和易讀的方式實例:

class Human 
    DEFAULTS: 
    name: 'default name' 

    constructor: (opts = {}) -> 
    _.extend @, @DEFAULTS, opts 

    printName: -> 
    console.log 'My name is ' + @name