1.
Ext.Base
function Base(){}
Base.prototype = {
constructor : function(){
return this;
},
callParent: function() {
// 这个方法很OOP, 通过他可以调用到父类的重写方法.
// 那它是如何实现的呢?
// 得到子类(this)的原型方法callParent的调用者, 如在constructor调用 callParent,则返回constructor函数.
var method = this.callParent.caller,
parentClass, methodName;
// 返回的constructor函数的所有者,在这是是子类(this),即构造函数.
// $owner 这个在定义类的时候会初始化(implement).
// 然后得到子类的父类
parentClass = method.$owner.superclass;
// 得到 constructor的名字, 定义类的时候会初始化(implement).
methodName = method.$name;
// 调用父类同名方法.
return parentClass[methodName].apply(this, args || []);
}
}
override 与 implement 的区别?
implement 用于添加类方法与属性
override 用于覆盖类的方法(fn),并保留覆盖方法到 fn.$previous.
callOverride 调用被覆盖的方法 fn.$previous.
callParent 调用父类被重写方法
关于 重载/覆盖/重写的区别:
在JS中其实只有覆盖这一说.因此根据行为我们认为单纯的覆盖就是覆盖,重写一般是继承关系的一种覆盖,而重载在JS中是不允许的.
borrow:简单的从其它类的原型复制方法到类的原型.
关于类与类的原型的区别:
类即是构造函数,通常绑定静态属性
而类的原型的属性可以继承,也是通常的 Java类.因此说类时理解可能模糊.
mixin: 这个译法通常叫织入, 与 borrow 的区别在于:
它织入的是整个类的原型.并保存织入类的原型到mixins, 类似多继承.
2
Ext.Class
Ext.Class = Class = function(newClass, classData, onClassCreated)
动态的创建一个类.
newClass : 构造函数
classData: 类属性与一些配置信息
onClassCreated: 类创建时的回调函数
内部实现如下:
2.1 复制 Ext.Base 的静态属性
2.2 预处理器:
name: preprocessor.call(this, newClass, classData)
默认配置:
'extend'
'statics'
'inheritableStatics'
'config'
'mixins'
2.3 复制类属性: newClass.implement(classData);
2.4 onClassCreated
这个方法在 ExtJS 中用于调用后处理器处理一些逻辑.
2.5 返回创建的类
预处理器详细原型剖析:
extend:
// 得到父类, 没有则为 Ext.Base
// 在使用时这里如果是字符串,会去ClassManager找到名字对应的类
data.extend
// 有了它就可以完成原型链
//如果父类不是 Ext.Base的子类, 需要修改注入Ext.Base原型属性到父类的原型.
// 类指针,永远指向自己.
clsPrototype.self = cls;
// 父类指针
cls.superclass = clsPrototype.superclass = parentPrototype;
复制父类的可继承静态属性, 不知道这个地方为什么就处理了??
复制父类原型的config.不知道这个地方为什么就处理了??
statics:
简单的添加 data.statics 到类.
inheritableStatics:
简单的添加 data.inheritableStatics 到类,并标识这些属性是可以继承的.
config:
简单的从 data.config 生成属性的get/set方法到类的原型的config属性.
mixins:
简单的织入类.
3.
ClassManager
className 处理器
xtype 处理器
alias 后处理器
data.alias
singleton 后处理器
alternateClassName 后处理器
data.alternateClassName
instantiate
3.1 根据名字查找类
cls: name -> 别名alias ->快捷名alternate ->远程同步加载 load
同步加载加载实现细节:
Ajax.ajax({
url: url,
async: false,
success: function(response) {
new Function(response.body + "\n//# sourceURL=" + url)();
}
});
3.2
new cls(arguments1, arguments2, ... , argumentsN);
4.
一个对象就这样子创建出来了.