2012-04-30 3 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 и, исходя из объектно-ориентированного языка, я обнаружил такое замешательство.

+0

Да, инициализация коллекции в конструкторе исправляет ее. довольно контр-интуитивно понятный. – pstanton

Смежные вопросы