2

私は、JavaScriptの継承がどのように機能するかについての私の誤解である可能性が高い、奇妙な動作と見なすものに遭遇しました...

クラスとサブクラスを作成するためにprototypejsに基づくOpenLayersを使用しています。スーパークラスで宣言されたフィールドは、1つまたは複数のクラスのインスタンス化ごとに個別のオブジェクトになると予想していました。ただし、以下の例でわかるように、これは当てはまらないようです。

スーパークラス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>
4

1 に答える 1

0

これについてはよくわかりませんがcollection、クラスのフィールドを初期化したためだと思います。クラスは単なるオブジェクトであり、関数ではないことに注意してください。インスタンスレベルにしたい場合は、コンストラクターで初期化する必要があります。OpenLayersの場合はinitialize。jQuery UIで同様の動作を観察し、オブジェクト指向言語から来たので、この種の混乱を見つけました。

于 2012-04-30T10:18:36.870 に答える