我刚刚偶然发现了我认为奇怪的行为,这很可能只是我对 javascript 继承如何工作的误解...
我正在使用 OpenLayers,它基于 prototypejs 来创建类和子类。我希望父类(super class)中声明的字段在类或子类的每个实例化中成为单独的对象。然而,情况似乎并非如此,正如您在下面的示例中所见。
父类(super class) MySuperClass
定义了字段 collection
但是即使我构造了这个类的多个实例,并且通过子类字段 collection
似乎共享,就好像它是 static
?
为什么会这样,如何在父类(super class)的定义中安全地创建实例变量?
<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>
最佳答案
我不太确定这个,但我猜这是因为你在类中初始化了 collection
字段。请注意,该类只是一个对象,而不是一个函数。如果你希望它在实例级别,你应该在构造函数中初始化它,如果是 OpenLayers,它是 initialize
。我在 jQuery UI 中观察到类似的行为并且来自面向对象的语言,我发现这种混淆。
关于javascript - 继承 - 实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10381770/