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 に答える