6

誰かが私にこの振る舞いを説明してもらえますか?クラスを宣言しましょう:

Ext.define('baseClass',{
    a:null,
    ar:[],

    add:function(v) {
        this.ar.push(v);
    },
    sayAr:function() {
        console.log(this.ar);
    },

    setA:function(v) {
        this.a= v;
    },
    sayA:function() {
        console.log(this.a);
    }
});

次に、2つのオブジェクトを作成します

var a = Ext.create('baseClass');
var b = Ext.create('baseClass');

プロパティをテストする

a.setA(1);
b.setA(2);

a.sayA();
b.sayA();

この出力

1
2

すべて大丈夫ですが

a.add(1);
b.add(2);

a.sayAr();
b.sayAr();

我々が得る

[1,2]
[1,2]

これはわかりません。なぜそれは別々の「a」プロパティを使用するのに、両方のオブジェクトに1つの「ar」配列を使用するのですか。「ar」は静的として宣言されていません!まったくわかりません。

4

2 に答える 2

8

クラス宣言に何かを入れると、それはオブジェクトのプロトタイプにプッシュされることを意味します(読んでください:それはすべてのインスタンス間で共有されます)。文字列/数値/ブールの場合は実際には問題ではありませんが、オブジェクトと配列の場合は、この動作が有効になることがわかります。

インスタンスごとに配列/オブジェクトが必要な場合は、インスタンスに明示的に追加する必要があります。

Ext.define('baseClass',{
    a:null,

    constructor: function(){
        this.ar = [];
    }

    add:function(v) {
        this.ar.push(v);
    },
    sayAr:function() {
        console.log(this.ar);
    },

    setA:function(v) {
        this.a= v;
    },
    sayA:function() {
        console.log(this.a);
    }
});
于 2012-08-15T07:13:47.460 に答える
3

これは、このビットが原因です。

Ext.define('baseClass',{
   a:null,
   ar:[], <--------------------------- you're instantiating an array object!

明確にするために、上記のコードは次のようになります。

Ext.define('baseClass',{
   a:null,
   ar:new Array(),

したがって、オブジェクトコンストラクターは完全な配列オブジェクトではなく配列への参照のみをコピーするため、両方のオブジェクトは同じ配列を共有します。

Ext.jsがコンストラクター/イニシャライザーをどのように処理するかはわかりませんが、宣言するときではなく、オブジェクトの構築中に配列を作成する必要があります。

OK、グーグルは私にこれをくれました:

Ext.define('baseClass',{
    constructor: function () {
        this.ar = [];
    },

それはあなたの問題を解決するはずです。

于 2012-08-15T07:19:16.350 に答える