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>
是的,在構造函數中初始化集合確實修復了它。非常直觀。 – pstanton