[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.
一个对象就这样子创建出来了.









你可能感兴趣的:(JavaScript,oop)