0

假设我在 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, ... )
4

3 回答 3

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'
于 2013-03-07T14:28:45.307 回答
0

好的,将对象作为参数传递给构造函数作为参考工作。感谢 Amber 的提醒。

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'
于 2013-03-07T14:49:45.243 回答
0

underscore您可以使用来自(或提供类似功能的任何其他库)的一些帮助以非常简单易读的方式编写它extend

class Human
  DEFAULTS:
    name: 'default name'

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

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

顺便说一句,您可以将道具直接附加到实例:

class Human
  DEFAULTS:
    name: 'default name'

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

  printName: ->
    console.log 'My name is ' + @name
于 2013-03-08T13:05:17.260 回答