javascript - 继承 - 实例变量

标签 javascript inheritance prototypejs openlayers

我刚刚偶然发现了我认为奇怪的行为,这很可能只是我对 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/

相关文章:

c++ - 覆盖基类成员变量的初始值

Javascript 经典继承调用父级

java - 如何将现有树(有 child ,但没有 parent )扩展为双向链接树?

javascript - Prototype 和 jQuery 之间的冲突

javascript - 观察 DOM 中动态插入对象的事件

javascript - 如何使用自定义助手( Handlebars )实现嵌套的每个循环

javascript - 如何使用 fs 从 json 文件中获取 ID

javascript - Nodejs MySQL : Accessing variable in another route

javascript - jqMobi 使用 ajax 数据动态更新元素

javascript - 使用 Prototype JS 动态添加 CSS