Ext.apply、Ext.applyIf和Ext.extend的理解
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.apply和Ext.applyIf方法都是用于把一个对象中的属性复制到另外一个对象的属性中。两者的差异在于apply将会覆盖目标对象中的属性,而applyIf只复制目标对象中没有而源对象中有的属性。
?
B、官方说明
apply(?Object?obj,?Object?config,?Object?defaults?)?:?Object
该方法包含三个参数,第一个参数是要拷贝的目标对象,第二个参数是拷贝的源对象,第三个参数是可选的,表示给目标对象提供一个默认值。意味着如果第三个参数有值,则将第三个参数也复制到目标对象中。
applyIf(?Object?obj,?Object?config?)?:?Object
applyIf方法的功能跟apply一样,只是不会拷贝那些在目标对象及源对象都存在的属性。
及方法都是用于实现把一个对象中的属性应用于另外一个对象中,相当于属性拷贝。不同的是将会覆盖目标对象中的属性,而只拷贝目标对象中没有而源对象中有的属性。方法的签名为“(Object,Object,Object):Object”,该方法包含三个参数,第一个参数是要拷贝的目标对象,第二个参数是拷贝的源对象,第三个参数是可选的,表示给目标对象提供一个默认值。可以简单的理解成把第三个参数(如果有的话)及第二个参数中的属性拷贝给第一个参数对象。看下面的代码:??? <script>
Ext.(function(){
var={
:"p1 value",
?????????????
:"p2 value",
?????????????
:function(){(this.)},
?????????????
:function(){(this.)}
};
??????????
var=newObject();
??????????
.="b2 value";
??????????
Ext.(,);
??????????
.();// 这个挺有意思,不仅属性会复制,连b1中的f1方法也可以被复制和使用
// ( 有点费话,因为f1和f2就是以属性的形式生命的 )
??????????
?????????? b2.f2();
??????????
//会使得b2中包含一个p3的属性,值为"p3 value"。
?????????? Ext.apply(b2,b1,{p3:"p3 value"});
?
??????
?????????? alert(b2.p3)?????
?
?????? });
??? </script>
在上面的代码中,Ext.(,)这一语句把的属性拷贝到了对象中,因此调用的方法可以弹出"p2 value"的提示信息。尽管对象已经包含了属性值,但拷贝后该属性值会被覆盖。可以在调用方法时,在第三个参数中指定拷贝属性的默认值,比如下面的代码:Ext.(,,{:"p3 value"});(.);这样会使得中包含一个的属性,值为"p3 value"。方法的功能跟一样,只是不会拷贝那些在目标对象及源对象都存在的属性。比如把前面演示方法的代码改成,如下:Ext.(,);.();由于中已经存在了属性,因此,.()方法中引用this.的时候,得到的是"b2 value",而不是在中定义的"p2 value"。