extjs中apply和applyIf的用法
extjs中apply和applyIf的用法apply
方法的签名
apply( Object obj, Object config, Object defaults ) : Object
参数说明
第一个参数是要复制的目标对象;第二个参数是复制的源对象;第三个参数是默认源对象,第三个参数是可选的,意味着如果第三个参数有值,则将第三个参数也复制到目标对象中
apply定义的源代码
Ext.apply = function(object, config, defaults) {
if (defaults) {
Ext.apply(object, defaults);
}
if (object && config && typeof config === 'object') {
var i, j, k;
for (i in config) {//复制所有属性
object[i] = config[i];
}
if (enumerables) {
for (j = enumerables.length; j--;) {
k = enumerables[j];
if (config.hasOwnProperty(k)) {
object[k] = config[k];
}
}
}
}
return object;
};
apply实例
var b1={ p1:"p1 value", p2:"p2 value", f1:function(){alert(this.p2)}};
var b2=new Object();
b2.p2="b2 value";
Ext.apply(b2,b1);
b2.f1();
可以在调用apply方法时,在第三个参数中指定拷贝属性的默认值,比如下面的代码
Ext.apply(b2,b1,{p3:"p3 value"});
alert(b2.p3);
这样会使得b2中包含一个p3的属性,值为"p3 value"。
applyIf
功能跟apply一样,只是不会拷贝那些在目标对象及源对象都存在的属性。
定义的源代码
applyIf: function(object, config) {
var property;
if (object) {
for (property in config) {
if (object[property] === undefined) {//如果object中不含有这个属性,复制属性,否则不复制
object[property] = config[property];
}
}
}
return object;
},
applyIf实例:
比如把前面演示apply方法的代码改成applyIf,如下:
Ext.applyIf(b2,b1);b2.f1();
由于b2中已经存在了p2属性,因此,b2.f1()方法中引用this.p2的时候,得到的是"b2 value",而不是在b1中定义的"p2 value"。