난 그냥이 아니라 단지 자바 스크립트 상속이 어떻게 작동하는지 내 오해 될 수있는 이상한 행동을 고려할 것을 우연히 발견 한 ...상속 - 인스턴스 변수
내가 만드는 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>
예, 생성자에서 컬렉션을 초기화하면 수정됩니다. 꽤 반 직관적. – pstanton