8

私のアプリケーションには、次のようなオブジェクトを定義するスーパークラスがあります。

Ext.define('superclass', {
    myObject: {
        prop1: true,
        prop2: 200,
        ..
    }

上記のスーパークラスを継承し、同じオブジェクトを宣言する子クラス:

Ext.define('childclass', {
    extend: 'superclass',

    myObject: {
        prop3: false,
        prop4: false,
        ..
    }

問題は、子クラスのmyObjectにはprop3プロパティとprop4プロパティしかないということです。

myObject ib子クラスにすべてのprop1、prop2、prop3、およびprop4プロパティが必要です。

これどうやってするの ?

4

3 に答える 3

5

コンストラクター (Ext.Component を拡張する場合は initComponent 内) でオブジェクトを拡張します。

Ext.define('childclass', {
    extend: 'superclass',

    constructor: function() {
        this.myObject = Ext.apply({}, this.myObject, {
            prop3: false,
            prop4: false
        });
        this.callParent(arguments);
    }
});

デモ

于 2013-03-18T15:02:31.050 に答える
3

提供された両方の回答は、子クラスが構築されるとすぐにスーパークラス プロトタイプの myObject プロパティを変更します。これはあなたが望むものではないかもしれません。なぜこのようにクラス プロトタイプにオブジェクトを配置するのか疑問に思います。一般的に、それを行うのは得策ではありません。しかし、本当にしたい場合は、これを行うことができます

Ext.define('childclass', {
    extend: 'superclass',

    // I'm adding an empty object here so that myObject on the
    // prototype does not get overridden.
    myObject: Ext.merge({}, superclass.prototype.myObject, {
        prop3: false,
        prop4: false
    });

});
于 2013-03-18T16:17:22.283 に答える
0

@Molecular man's answer is correct, however I would use the merge function.

Lets say you have this in your first config:

myObject: {
   prop1: false,
   person: {
       name: "John"
   }
}

And your second object

myObject: {
   prop2: false,
   person: {
       surname: "Doe"
   }
}

Your apply will overwrite person and you'll only have person.surname.

Into something like this:

myObject: {
   prop1: false,
   prop2: false,
   person: {
       surname: "Doe"
   }
}

Merge will merge the two objects.

Ext.define('childclass', {
    extend: 'superclass',

    constructor: function() {
        this.myObject = Ext.merge(this.myObject, {
            prop3: false,
            prop4: false
        });
        this.callParent(arguments);
    }
});

Note that this will only be needed in the sitation as described in my example, if not you can use Molecular's answer.

于 2013-03-18T16:03:07.370 に答える