6

拡張したいシングルトンクラスを作成しました。それは(半分)クラスの単一のインスタンスのみを作成するという点で機能しますが、サブクラスに追加されたプロパティは未定義です。元のシングルトンは次のとおりです。

class Singleton
   _instance = undefined
   @getInstance: ->
      if _instance is undefined
         console.log 'no instance exists, so create one'
         _instance = new _Singleton()
      else
         console.log 'an instance already exists.'

class _Singleton
   constructor: ->
      console.log 'new singelton'

module.exports = Singleton

そして、ここにサブクラスがあります:

Singleton = require('./singleton')

class Stinky extends Singleton
      constructor: ->
         var1 : 'var1'


module.exports = Stinky

ノードアプリで以下を使用すると、次のようになります。

Stinky = require './stinky'
thing1 = Stinky.getInstance()
thing2 = Stinky.getInstance()
console.log "Thing var1: #{thing1.var1}"

getInstance()メソッドは期待どおりに動作しますが、var1は未定義です。シングルトン以外のクラスでこれと同じことを行うと、正常に機能します。ありがとう。

4

3 に答える 3

12

私はあなたのコードを少し減らしました。残りの 2 つのクラスは次のとおりです。

class Singleton
  @_instance: null
  @getInstance: ->
    @_instance or= new @( arguments... )

class Stinky extends Singleton
  constructor: ( @num ) ->

thing1 = Stinky.getInstance( 1 )
thing2 = Stinky.getInstance( 2 )

console.log( thing1.num, thing2.num )

次の変更を加えました。

  • Singleton と _Singleton のマージ
  • _instance を @_instance に変更して、プロトタイプではなく Singleton にアタッチされるようにしました
  • getInstance に引数 splat を追加しました (引数が必要な場合)
  • getInstance() をシングルトンではなく拡張オブジェクトに向ける

この例では、2 番目のコンストラクターが呼び出されないようにするために、2 つの異なる番号を使用しました。

于 2012-04-13T18:06:09.520 に答える
2

クラスを使用してプライベートクラスをシミュレートする方法はわかりますが_Singleton、残念ながら、この場合は使用できないと思います。

動作するコードは次のとおりです。

class Singleton
   _instance = undefined

   constructor: ->
      console.log 'new singleton'

   @getInstance: ->
      if _instance is undefined
         console.log 'no instance exists, so create one'
         _instance = new @()
      else
         console.log 'an instance already exists.'
      _instance

class Stinky extends Singleton
      constructor: ->
         console.log 'Stinky constructor'
         @var1 = 'var1'


thing1 = Stinky.getInstance()
thing2 = Stinky.getInstance()

console.log "Thing var1: #{thing1.var1}"​​​​​​​​​​​​​​​​​​, thing1, thing2​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

Node.js(必須)コードを削除しましたが、追加するのは簡単です。主な違いは、私のコードが作成しているインスタンスがまたはのインスタンスであるということ@ですthis。そうすることで、コンストラクターが最初に呼び出され、次に親チェーンを継続して呼び出されるようになります。コードは明示的にのインスタンスを作成していた_Singletonため、Stinkyコンストラクターは呼び出されませんでした。最終的に気付くであろうもう1つの小さな問題は、getInstanceメソッドが実際にはのインスタンスを返さないことでした_instance

これがお役に立てば幸いです。

Sandro

于 2012-04-13T14:55:35.983 に答える
1

目標が何かはわかりませんがSingleton、実際のシングルトン (単純なオブジェクト) を作成することで同じ結果を得ることができます。

Singleton =
    doNothing: ->
        # ...
    doMoreNothing: ->
        # ...

class Stinky
    constructor: ->
        @var1: 'var1'
    getInstance: ->
        return Singleton

Singleton自分自身を返すメソッドを持つことはあまり意味がありません。

于 2012-04-15T08:10:45.443 に答える