[EXTJS4] 类的定义与类的创建

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.
一个对象就这样子创建出来了.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值