2012-04-30 4 views
2

난 그냥이 아니라 단지 자바 스크립트 상속이 어떻게 작동하는지 내 오해 될 수있는 이상한 행동을 고려할 것을 우연히 발견 한 ...상속 - 인스턴스 변수

내가 만드는 prototypejs에 기반이되는, OpenLayers를 사용하고 있습니다 클래스 및 하위 클래스 나는 슈퍼 클래스에서 선언 된 필드가 클래스 나 서브 클래스의 각 인스턴스화에서 개별 객체가 될 것으로 예상했다. 그러나 이것은 아래의 예에서 볼 수 있듯이 그렇다고 볼 수 없습니다.

슈퍼 클래스 MySuperClass 내가이 클래스의 여러 인스턴스를 구성에도 불구하고 그러나 필드 collection를 정의하고 static 인 것처럼 서브 클래스를 통해 필드 collection은 공유 할 것 같다?

왜 그렇습니까? 수퍼 클래스의 정의에 인스턴스 변수를 안전하게 작성하는 방법은 무엇입니까?

<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