### Ext JS 4.1中的`Ext.apply`与`Ext.override`
#### 一、Ext.apply详解
`Ext.apply`是Ext JS框架中的一个核心方法,主要用于对象的属性合并。此方法能够将一个或多个对象的属性复制到目标对象中,从而实现对象之间的扩展和覆盖。
##### 1. 基本用法
`Ext.apply`的基本语法如下:
```javascript
Ext.apply(targetObject, sourceObject1[, sourceObject2, ...]);
```
- `targetObject`: 目标对象,将被扩展的对象。
- `sourceObject1`, `sourceObject2`, ...: 源对象,其属性将被复制到目标对象中。
##### 2. 实现原理
在提供的代码片段中,可以看到`Ext.apply`的实现方式如下:
```javascript
Ext.apply = function(o, c, defaults) {
if (defaults) {
Ext.apply(o, defaults);
}
if (o && c && typeof c == 'object') {
for (var p in c) {
o[p] = c[p];
}
}
return o;
};
```
这个实现主要包含以下几个步骤:
- 首先检查是否有默认值`defaults`传入,如果有,则先用这些默认值来扩展目标对象。
- 然后检查目标对象`o`和源对象`c`是否有效,并确保`c`是对象类型。
- 最后遍历源对象的所有属性,并将其添加到目标对象中。
#### 二、Ext.override详解
`Ext.override`是Ext JS框架提供的另一个非常重要的功能,用于在运行时动态地修改已存在的类的行为。通过这种方式,可以在不改变原始类定义的情况下,扩展或替换特定的方法。
##### 1. 基本用法
`Ext.override`的基本语法如下:
```javascript
Ext.override(originalClass, overrides);
```
- `originalClass`: 需要覆盖的原始类。
- `overrides`: 包含需要覆盖方法的新版本的对象。
##### 2. 实现原理
根据提供的代码片段,我们可以看到`Ext.override`的具体实现如下:
```javascript
Ext.override = function(origclass, overrides) {
if (overrides) {
var p = origclass.prototype;
Ext.apply(p, overrides);
if (Ext.isIE && overrides.toString != origclass.toString) {
p.toString = overrides.toString;
}
}
};
```
这个实现主要包括以下步骤:
- 首先检查是否有需要覆盖的属性`overrides`。
- 如果有,则获取原始类的原型对象,并使用`Ext.apply`方法将新的属性合并到原型对象中。
- 特别地,如果在Internet Explorer浏览器下且`overrides`中定义了新的`toString`方法,那么将覆盖原型对象上的`toString`方法。
#### 三、使用场景与注意事项
- **使用场景**:`Ext.apply`通常用于对象初始化或配置合并等场合,而`Ext.override`则更多地用于对现有类进行扩展或修改。
- **注意事项**:
- 使用`Ext.apply`时要注意源对象中的属性是否会覆盖目标对象中的同名属性。
- 使用`Ext.override`时需谨慎处理已有方法,避免造成不必要的副作用。
通过以上分析可以看出,`Ext.apply`与`Ext.override`都是Ext JS框架中非常实用的功能,合理利用它们可以极大地提高开发效率并增强程序的灵活性。