为什么在initComponent中使用Ext.apply

Oli*_*ins 11 extjs extjs4

initComponent方法中为组件设置属性时,许多代码示例都使用Ext.apply.

示例:

    initComponent: function(){
        Ext.apply(this, {
            items: {
                xtype: 'button'
            }
    })},
Run Code Online (Sandbox Code Playgroud)

我的问题是,与这样做相比,这样做有什么不同:

    initComponent: function(){
        this.items = {
            xtype: 'button'
        }
    }
Run Code Online (Sandbox Code Playgroud)

对我来说,它似乎更具可读性.但是我错过了从Ext.apply获得的东西吗?

sra*_*sra 11

Ext.apply() 用于简化从源到目标对象的许多属性的复制(大多数情况下源和目标对象具有不同的属性集),并且它还可以用于应用默认值(第三个参数).

请注意,它不会产生深度克隆!这意味着如果您将数组或对象作为属性值,它将应用引用!

还有一个applyIf()只复制目标对象中尚不存在的属性.在某些情况下,两种实现都具有删除复制对象的引用的好处.

注意:你的第二种方式不起作用,因为你错过了this.


Eri*_*ler 7

initComponent: function(){
    items = {
        xtype: 'button'
    }
}
Run Code Online (Sandbox Code Playgroud)

你的意思是,不会初始化任何东西

initComponent: function(){
    this.items = {
        xtype: 'button'
    }
}
Run Code Online (Sandbox Code Playgroud)

这与使用Ext.apply的示例相同.但Ext.apply在更复杂的情况下展示了它的力量,例如

var x = {a: 1, c:3, e:5};
Ext.apply(x, {b:2, d:4, f:6});

console.log(x); // Object {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6}
Run Code Online (Sandbox Code Playgroud)

这通常用于使用给定的init参数覆盖组件的默认选项.