Ext.apply、Ext.applyIf和Ext.extend的理解

本文详细介绍了Ext.js库中的apply、applyIf和extend方法的使用方式,包括它们如何进行对象属性的复制和继承,并通过代码示例展示了实际应用。文章深入分析了这些方法的区别,帮助开发者更好地理解和运用Ext.js提供的对象操作功能。

http://hi.baidu.com/tomte/item/1809eb6f513ee5156895e6bb

http://hi.baidu.com/tag/extjs%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/feeds

Ext.apply、Ext.applyIf和Ext.extend

Ext.apply(obj, config, [defaults]) 将config对象的所有属性都复制到另一个对象obj上, 第三个参数defaults可以用来提供默认值, 不过通常指用前两个参数就够了。 这个函数主要用在构造函数中, 用来将配置复制到对象上。


Ext.applyIf(obj, config) 和Ext.apply的功能类似, 唯一不同的是, 这个函数只会将config对象中有, 而obj对象中没有的属性复制到obj上。 Ext.extend(subclass, superclass, [overrides]) 用来继承已有的类, 通常的使用方法是 var SubClass = function() { SubClass.superclass.constructor.call(this); };


Ext.extend(SubClass, BaseClass, { newMethod : function() {}, overriddenMethod : function() {} };在上面的代码中, SubClass继承自BaseClass, 添加了新的方法newMethod, 重写了overriddenMethod方法。
apply方法的签名为“apply( Object obj, Object config, Object defaults ) : Object”,
第一个参数是要拷贝的目标对象,
第二个参数是拷贝的源对象,
第三个参数是可选的,表示给目标对象提供一个默认值。
可以简单的理解成把第三个参数(如果有的话)及第二个参数中的属性拷贝给第一个参数对象。

 

Ext源代码如下:
view plaincopy to clipboardprint?
/** 
* Copies all the properties of config to obj. 
* @param {Object} obj The receiver of the properties 
* @param {Object} config The source of the properties 
* @param {Object} defaults A different object that will also be applied for default values 
* @return {Object} returns obj 
* @member Ext apply 
*/ 
Ext.apply = function(o, c, defaults){   
    // no "this" reference for friendly out of scope calls   
    if(defaults){   
        Ext.apply(o, defaults);   
    }   
    if(o && c && typeof c == 'object'){   
        for(var p in c){   
            o[p] = c[p];   
        }   
    }   
    return o;   
}; 
/**
* Copies all the properties of config to obj.
* @param {Object} obj The receiver of the properties
* @param {Object} config The source of the properties
* @param {Object} defaults A different object that will also be applied for default values
* @return {Object} returns obj
* @member Ext apply
*/
Ext.apply = function(o, c, defaults){
    // no "this" reference for friendly out of scope calls
    if(defaults){
        Ext.apply(o, defaults);
    }
    if(o && c && typeof c == 'object'){
        for(var p in c){
            o[p] = c[p];
        }
    }
    return o;
}; 
另外还有ext.applyif 也是对象克隆,不同的是,克隆的对象并不会覆盖原有属性和方法
具体代码如下:
view plaincopy to clipboardprint?
applyIf : function(o, c){   
    if(o){   
        for(var p in c){   
            if(!Ext.isDefined(o[p])){   
                o[p] = c[p];   
            }   
        }   
    }   
    return o;   
},

http://leroyhzy.blog.163.com/blog/static/2098941532012725112516785/

Ext apply applyIf 方法的应用
 

A、引言

Ext.applyExt.applyIf方法都是用于把一个对象中的属性复制到另外一个对象的属性中。两者的差异在于apply将会覆盖目标对象中的属性,而applyIf只复制目标对象中没有而源对象中有的属性。

 

B、官方说明

apply( Object obj, Object config, Object defaults ) : Object

该方法包含三个参数,第一个参数是要拷贝的目标对象,第二个参数是拷贝的源对象,第三个参数是可选的,表示给目标对象提供一个默认值。意味着如果第三个参数有值,则将第三个参数也复制到目标对象中。

applyIf( Object obj, Object config ) : Object

applyIf方法的功能跟apply一样,只是不会拷贝那些在目标对象及源对象都存在的属性。

 
 
        apply applyIf 方法都是用于实现把一个对象中的属性应用于另外一个对象中,相当于属性拷贝。不同的是 apply 将会覆盖目标对象中的属性,而 applyIf 只拷贝目标对象中没有而源对象中有的属性。
apply 方法的签名为“ apply ( Object obj , Object config , Object defaults ) : Object ”,该方法包含三个参数,第一个参数是要拷贝的目标对象,第二个参数是拷贝的源对象,第三个参数是可选的,表示给目标对象提供一个默认值。可以简单的理解成把第三个参数(如果有的话)及第二个参数中的属性拷贝给第一个参数对象。看下面的代码:

    <script>

       Ext.onReady(function(){

           var b1 ={

              p1:"p1 value",

             

              p2:"p2 value",

             

              f1:function(){alert(this.p1)},

             

              f2:function(){alert(this.p2)}

           };

          

           var b2 =newObject();

          

           b2.p1="b2 value";

          

           Ext.apply(b2,b1);

          

           b2.f1();// 这个挺有意思,不仅属性会复制,b1中的f1方法也可以被复制和使用

// ( 有点费话,因为f1f2就是以属性的形式生命的 )

          

           b2.f2();

          

//会使得b2中包含一个p3的属性,值为"p3 value"

           Ext.apply(b2,b1,{p3:"p3 value"});

 

      

           alert(b2.p3)     

 

       });

    </script>

 
      
在上面的代码中, Ext . apply ( b2 , b1 )这一语句把 b1 的属性拷贝到了 b2 对象中,因此调用 b2 f1 方法可以弹出 "p2 value" 的提示信息。尽管 b2 对象已经包含了 p2 属性值,但拷贝后该属性值会被覆盖。可以在调用 apply 方法时,在第三个参数中指定拷贝属性的默认值,比如下面的代码:
Ext.apply(b2,b1,{p3:"p3 value"});

            alert(b2.p3);
这样会使得 b2 中包含一个 p3 的属性,值为 "p3 value"
applyIf 方法的功能跟 apply 一样,只是不会拷贝那些在目标对象及源对象都存在的属性。比如把前面演示 apply 方法的代码改成 applyIf ,如下:
Ext.applyIf(b2,b1);

            b2.f1();
由于 b2 中已经存在了 p2 属性,因此, b2 . f1 ()方法中引用 this . p2 的时候,得到的是 "b2 value" ,而不是在 b1 中定义的 "p2 value"
<think>好的,用户想了解如何在Ext.js中打开窗口并传递参数。首先,我需要回忆一下Ext JS的相关知识,特别是窗口组件参数传递的方法。 Ext JS的窗口通常通过Ext.window.Window类来创建。要传递参数,常见的方法可能是在创建窗口实例时直接设置配置项,或者通过自定义事件或方法传递数据。另外,可能需要考虑父子组件之间的通信,或者在控制器中处理参数。 用户可能需要具体的代码示例,所以应该分步骤说明。首先是如何创建窗口,然后是如何传递参数,接着在窗口中如何接收这些参数。可能还需要提到不同版本的Ext JS(比如经典工具包现代工具包)之间的差异,但用户没有指定版本,所以可能需要通用一点的例子。 需要确保步骤清晰,首先创建窗口并传参,然后在窗口内部获取参数。例如,可以在窗口的配置项中添加自定义参数,然后在初始化时通过this或config对象访问。或者使用Ext.apply将参数合并到配置中。 另外,可能还需要提到通过事件监听传递参数,比如在打开窗口时触发事件,并在事件中包含参数。或者使用ViewModelData绑定来传递参数,但这种方法可能稍微复杂一些。 需要检查代码语法是否正确,比如使用Ext.create正确创建窗口,配置项是否正确。例如,在initComponent方法中访问配置参数,或者使用listeners来处理按钮点击事件,并将参数传递回父组件。 可能还需要提醒用户注意窗口的显示方法,比如使用show()或添加到视口。传参后,在子窗口中如何访问这些参数,可能需要通过this.customParam或者this.config.customParam,具体取决于Ext JS的版本配置项的处理方式。 另外,考虑是否有其他传参方式,比如URL参数或者本地存储,但这些可能不是最佳实践。应该专注于Ext JS原生的方法,比如配置对象自定义属性。 最后,确保回答结构清晰,分步骤说明,并提供完整的代码示例,让用户能够直接复制调整。同时,指出可能需要注意的地方,比如作用域的问题或版本差异。</think>在 Ext.js 中打开窗口并传递参数可通过以下步骤实现: --- ### 步骤 1 - 创建窗口类 ```javascript Ext.define('MyApp.view.MyWindow', { extend: 'Ext.window.Window', title: '参数示例窗口', width: 300, height: 200, // 声明自定义参数接收 config: { customParam: null // 用于接收外部参数 }, initComponent: function() { // 在初始化时访问参数 console.log('接收到的参数:', this.customParam); this.callParent(); }, items: [{ xtype: 'displayfield', value: '参数值:' + this.customParam // 显示参数 }] }); ``` --- ### 步骤 2 - 打开窗口并传参 ```javascript // 创建窗口实例时通过配置项传参 var win = Ext.create('MyApp.view.MyWindow', { customParam: { id: 1001, name: '示例数据' } }); // 显示窗口 win.show(); ``` --- ### 进阶方式 - 动态传参 ```javascript // 通过方法动态传参 win.setCustomParam({ action: 'edit', recordId: 2002 }); // 在窗口内通过 getter 获取 var currentParam = win.getCustomParam(); ``` --- ### 参数传递原理 1. **Config 系统**:通过 `config` 属性声明参数,自动生成 `getCustomParam()` `setCustomParam()` 方法 2. **直接属性赋值**:创建窗口时通过构造函数直接注入参数 3. **响应式更新**:使用 `setCustomParam()` 可实现参数动态更新 --- ### 注意事项 1. 使用 `Ext.apply` 合并配置参数时需注意对象引用问题 2. 参数命名避免 ExtJS 内置属性冲突(如 `title`, `width` 等) 3. 现代工具包(Modern Toolkit)中推荐使用 `viewModel` 进行数据绑定传参 完整示例代码结构应包含控制器、视图定义参数验证逻辑,可根据具体业务需求扩展参数处理机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值