2

私は Coffee Script を始めたばかりで、クラ​​ス拡張がどのように機能するかを理解するのに問題があります。親クラスでインスタンス プロパティとして定義されたプロパティは、そのクラスが拡張されたときに静的プロパティとして実装されているようです。

Foo という名前のクラスがあり、これを 2 つのサブクラス Bar と Goo の基本クラスとして使用したいと考えています。Foo に foobs というインスタンス プロパティと、foob を追加するメソッドを次のように指定します。

class Foo
    foobs:[]
    addFoob: (foob) ->
        @foobs.push(foob)

そして、Foo を Bar と Goo で拡張し、次のように新しいインスタンスを作成します。

class Bar extends Foo
    otherMethod: ->
        alert 'doing other stuff'

class Goo extends Foo
    secondMethod: ->
        alert 'doing second stuff'

barInstance = new Bar()
gooInstance = new Goo()

しかし、Foob を barInstance に追加すると、gooInstance にも追加されます!

barInstance.addFoob('test')

console.log gooInstance.foobs (outputs ["test"])

明らかに、私はここで何か間違ったことをしています。barInstance と gooInstance にそれぞれ独自の「foobs」プロパティを持たせたいのですが、何らかの理由で foobs は Foo のインスタンス プロパティであるにもかかわらず、Bar と Goo のクラス プロパティとして割り当てられているようです。これを回避する方法についてのアイデアはありますか? それとも、私が知らない別の構文があるのでしょうか?

ありがとう

4

3 に答える 3

2

これは、配列をFooプロトタイプに配置しているためであり、すべてのインスタンスで共有されます。代わりに、のインスタンスごとに配列を作成し、Fooそれを直接追加する必要があります。

class Foo
  foobs:null, # This isn't needed, but it's good for documentation.
  constructor: ->
    @foobs = []
  addFoob: (foob) ->
    @foobs.push(foob)

別の見方をすると、あなたが持っているものは本質的に次のとおりです。

sharedFoobs = []

class Foo
  foobs: sharedFoobs

これにより、新しい配列が作成されないことが少し明確になります。

于 2013-04-09T03:18:38.990 に答える
1

foobs配列はコンストラクターで初期化する必要があります。foobsこれは、prototype.

でプリミティブ値を安全に定義できます。これらの値は不変であるためです。ただし、これらの値をすべてのインスタンスで共有する場合を除き、prototypeオブジェクトを に保存することは避けてください。prototype

于 2013-04-09T03:17:57.883 に答える