2012-04-30 19 views
2

私はちょうど私がうまくちょうど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> 

答えて

0

私はこの1つについては本当にわからないんだけど、私はあなたのクラスでcollectionフィールドを初期化するので、それがあると思います。クラスは単なる関数ではなくオブジェクトであることに注意してください。インスタンスレベルにしたい場合は、コンストラクタで初期化する必要があります.OpenLayersの場合はinitializeです。私はjQueryのUIで同様の振る舞いを観察し、オブジェクト指向言語から来ていましたが、私はこの種の混乱を見つけました。

+0

はい、コンストラクタでコレクションを初期化すると、それが修正されます。かなりカウンター直感的。 – pstanton