2009-08-27 10 views
1

私はサブクラスによって拡張されたクラスを作成するために、prototype.jsの(www.prototypejs.orgから)ライブラリを使用しています。私はこれらのクラスのインスタンス内で配列を使用することに問題があります。私はこれを説明するための例を作りました:クラスprototype.jsの中の継承と配列

var SuperClass = Class.create({ 
    initialize: function(id) { 
     this.id = id; 
    } 
}); 

var SubClass = Class.create(SuperClass, { 
    items: [], 

    add: function(arg) { 
     this.items[this.items.length] = arg; 
    }, 

    initialize: function($super, id) { 
     $super(id); 
    } 
}); 

var a = new SubClass("a"); 
var b = new SubClass("b"); 

a.add("blah"); 
alert(a.id + ": " + a.items.length); 
alert(b.id + ": " + b.items.length); 

ここでの問題は、私は唯一の商品を追加しても、第一および第二のアラートは、それぞれのオブジェクトは、その項目の配列内の1つのアイテムを持っていることを示します両方ということですaに反対する。プリミティブデータ型は正常に動作します(idプロパティが正しく表示されているように表示されます)が、配列は機能しません。また、アイテム配列とaddメソッドをスーパークラスに移動しても問題はありません。すでに試してみました。

これを動作させる方法はありますか?これはPrototypeのバグですか、これはJavaScriptの性質のものですか? :-)

答えて

1

Class.createに渡されたオブジェクトリテラルのメンバーは、そのすべてのオブジェクトはアイテムアレイを共有することになり、サブクラスのプロトタイプに追加されます。

+0

うわー、迅速な解答:

は、ここではいくつかの例です。そして右のものも!ありがとう、本当にそれを感謝します。 – Jerry

0

私はプロトタイプユーザーではありませんが、JavaScriptはプロトタイプ言語です。つまり、プロトタイプの継承を使用します。言い換えれば、オブジェクトはオブジェクトから継承し、オブジェクトは他のオブジェクトから状態と動作を継承します。あなたのケースでは、オブジェクトab両方がMyClassののすべてのインスタンスがリテラルそのオブジェクトから継承するので、そうitemsは、2つの間で共有されるClass.create(SuperClass, {})にリテラル表記で宣言そのオブジェクトから継承します。

var Foo = function (name) { 
    this.name = name; 
}; 

var Bar = function() {}; 
Bar.prototype = new Foo("John"); 

var a = new Bar; 
var b = new Bar; 

alert(a.name); // John 
alert(b.name); // John