私はちょうど私がうまくちょうどjavascriptの継承がどのように動作するかの私の誤解かもしれない奇妙な行動を考えるものにつまずいてきました...継承 - インスタンス変数
私が作成するprototypejsに基づいている、OpenLayersをを使用していますクラスとサブクラスです。スーパークラスで宣言されたフィールドは、クラスまたはサブクラスのインスタンス化ごとに別々のオブジェクトになると予想しました。しかし、以下の例のように、これは当てはまりません。
スーパークラスMySuperClass
は、私は、このクラスの複数のインスタンスを構築するにもかかわらず、しかしフィールドcollection
を定義し、それがstatic
であるかのようにサブクラスを経由してフィールドcollection
は、共有しているようですか?
なぜそうであり、スーパークラスの定義にインスタンス変数を安全に作成するにはどうすればよいですか?
<script type="text/javascript" src="http://openlayers.org/dev/OpenLayers.js"></script>
<script type="text/javascript">
OpenLayers.MySuperClass = OpenLayers.Class(
{
collection: [],
initialize: function(options)
{
OpenLayers.Util.extend(this, options);
},
addItem: function(listener)
{
this.collection.push(listener);
}
});
OpenLayers.MySubClassOne = OpenLayers.Class(OpenLayers.MySuperClass,
{
initialize: function(options)
{
OpenLayers.MySuperClass.prototype.initialize.apply(this, arguments);
}
});
OpenLayers.MySubClassTwo = OpenLayers.Class(OpenLayers.MySuperClass,
{
initialize: function(options)
{
OpenLayers.MySuperClass.prototype.initialize.apply(this, arguments);
}
});
var instanceOne = new OpenLayers.MySubClassOne();
instanceOne.addItem("one");
var instanceTwo = new OpenLayers.MySubClassTwo();
instanceTwo.addItem("two");
var instanceSuperOne = new OpenLayers.MySuperClass();
instanceSuperOne.addItem("three");
var instanceSuperTwo = new OpenLayers.MySuperClass();
instanceSuperTwo.addItem("four");
alert(instanceOne.collection);
alert(instanceTwo.collection);
alert(instanceSuperOne.collection);
alert(instanceSuperTwo.collection);
</script>
はい、コンストラクタでコレクションを初期化すると、それが修正されます。かなりカウンター直感的。 – pstanton