2012-04-30 110 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