1

私はディーン・エドワードの base.jsを使用しました。私は何年もそれを使用してきましたが、フォーラムは死んでいるので、ここに投稿して、誰かが何が起きているかを知っているかどうかを確認しようと思いました. 以下は私の問題を示しています:

        var Animal = Base.extend({
            name: "",
            constructor: function(name){
                this.name = name
            },
            getName: function(){
                this.name
            }

        });

        var Cat = Animal.extend({

            prey: [],
            getPrey: function(){return this.prey}
        });

        var Tiger = Cat.extend({});
        var House = Cat.extend({});

        var cats = [];
        cats.push(new Tiger());
        cats.push(new House());

        cats[0].prey.push("dogs");
        cats[1].prey.push("mice");

        console.log(cats[0].getPrey());
        console.log(cats[1].getPrey());

基本的に、配列を持つ中間の親を使用して、3 レベルの階層 (最年長の親が必要かどうかは不明) を作成します。2 つの別個の子インスタンスが継承された配列に何かを追加すると、両方の子に表示されます。上記のコードがコンソールに出力されると思います:

["dogs"]
["mice"]

代わりに、次のように出力します。

["dogs", "mice"]
["dogs", "mice"]

何か不足していますか?これは意図的なものである可能性がありますが、型付き言語 OO の観点からすると、それが本来の動作方法ではないことは確かです。誰かが上記を行うためのよりエレガントな方法を持っている場合、私はすべて耳にします。

いつものように、大変お世話になりました。

4

2 に答える 2

2

修正は次のとおりです(コンストラクターを追加):

...をちょきちょきと切る...

var Cat = Animal.extend({

    prey: [],
     constructor: function(){
         this.prey = [];
     },
     getPrey: function(){return this.prey}
});

...をちょきちょきと切る...

解決策は、MiguelBollarという名前の同僚から私に与えられました。彼は紳士であり学者です。

于 2012-10-12T14:31:46.327 に答える
0

それ自体はバグではありません。セマンティクスを理解していません。参照型 ( JavaScript では )をCat.prey持つクラス レベルの属性です。コンストラクターで (再) 定義しない限り、すべてのインスタンスはまったく同じ参照を共有します。Python では以下と同じです。ObjectArray

class Cat:

  prey = []

  def getPrey(self):
    return self.prey

c1 = Cat()
c1.prey.append('foo')
c2 = Cat()
c2.prey.append('bar')

print c1.getPrey() # ['foo', 'bar']
print c2.getPrey() # ['foo', 'bar']

すでに学んだように、参照型はコンストラクターで初期化する必要があります

于 2014-10-17T10:23:35.807 に答える