2012-04-30 109 views
2

我只是偶然發現了什麼,我認爲奇怪的行爲可能也僅僅是我的Javascript繼承是如何工作的誤解......繼承 - 實例變量

我使用的OpenLayers,它是基於prototypejs創建類和子類。我期望在超類中聲明的字段將成爲類或子類的每個實例中的單獨對象。這似乎並不是這種情況,正如你可以在下面的例子中看到的那樣。

超類MySuperClass定義字段collection但即使我構建此類的多個實例,並通過子場collection似乎是共享的,就好像它是static

爲什麼會這樣,以及如何在超類的定義中安全地創建實例變量?

<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

我真的不知道這一個,但我想那是因爲你在類初始化collection領域。注意這個類只是一個對象,而不是一個函數。如果你希望它在實例級別上,你應該在構造函數中初始化它,在OpenLayers的情況下它是initialize。我在jQuery UI中觀察到類似的行爲,並從面向對象的語言中發現,我發現這種混淆。

+0

是的,在構造函數中初始化集合確實修復了它。非常直觀。 – pstanton