Javascript Extjs合并对象

Javascript Extjs合并对象,javascript,extjs,extjs4,Javascript,Extjs,Extjs4,我的应用程序中有一个超类,它定义了如下对象: Ext.define('superclass', { myObject: { prop1: true, prop2: 200, .. } myObject: { prop1: false, prop2: false, person: { surname: "Doe" } } 以及继承上述超类的子类,该子类声明相同的对象: Ext.define('

我的应用程序中有一个超类,它定义了如下对象:

Ext.define('superclass', {
    myObject: {
        prop1: true,
        prop2: 200,
        ..
    }
myObject: {
   prop1: false,
   prop2: false,
   person: {
       surname: "Doe"
   }
}
以及继承上述超类的子类,该子类声明相同的对象:

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

    myObject: {
        prop3: false,
        prop4: false,
        ..
    }
问题在于,子类中的myObject只有prop3和prop4属性

我需要myObject ib子类具有所有prop1、prop2、prop3和prop4属性


如何执行此操作?

在构造函数中扩展对象(如果扩展Ext.Component,则在initComponent中扩展):


.Molecular man的答案是正确的,但是我会使用merge函数

假设您在第一次配置中有:

myObject: {
   prop1: false,
   person: {
       name: "John"
   }
}
你的第二个目标是什么

myObject: {
   prop2: false,
   person: {
       surname: "Doe"
   }
}
您的应用程序将覆盖person,并且您只有
person.姓氏

变成这样:

Ext.define('superclass', {
    myObject: {
        prop1: true,
        prop2: 200,
        ..
    }
myObject: {
   prop1: false,
   prop2: false,
   person: {
       surname: "Doe"
   }
}
“合并”将合并这两个对象

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

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

请注意,这仅在我的示例中描述的情况下才需要,如果不需要,您可以使用Molecular的答案。

提供的两个答案将在构建子类后立即更改超类原型的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
    });

});

这(以及Ext.merge解决方案)将更改超类原型上的
myObject
,这似乎不是理想的行为。您可能需要翻转参数,并将This.myObject作为Ext.apply的第三个(默认)参数。现在,子类的自定义属性将无法覆盖超类属性,因为myObject的属性将应用于子类的顶部。是的,没错,我不认为这是一个公认的、比下面wantok的答案更高的答案,这是任何人的猜测。确保你读了评论。重写prop1/2将失败(这不是问题的一部分,因此答案没有错,但这将适用于使用此解决方案的许多人)。这是可行的,但现在,我需要在子类中为超类添加一个“require”。这是正确的吗?在我的例子中,我使用的是Deftjs libs,我需要在类中声明一个“control”对象,即bind元素。@paulo我认为在定义childclass之前,您需要超类。在我正在研究的项目中,我们不使用Ext. Loader,超级文件已经包含进来了,所以这是我没有考虑到的。比目前接受的答案好得多,而且更早更早。我正面临着这个解决方案和分子人的问题。看起来myObject甚至为新的实例化对象(lest,派生这个超类的另一个子类类型)保留了这个新属性。