samtiger


QQ:418148757
Name:yangchuan
数据加载中……
Ext下类函数定义

一:Ext下类函数定义
extcore通过:Ext.extend方法来创建类(构造函数),这个类以下用sb代替。
这个类函数默认会有这些属性(类属性)。
superclass:父类,也就是第一个或第二个参数的prototype属性对象。(具体根据传入的参数类型决定)
superclass(): 父类,(sb.propertype下) 这是一个函数,该函数返回父类的propertype对象
supr():同上
constructor():构造函数,(sb函数的propertype对象下)实际上引用的就是sb函数自己。
override(o):重写方法,(sb函数下),调用的是 Ext.override(sb, o);也就是将o中的属性复制到sb的propertype下。
override(o):重写方法,(sb.propertype下)也就是将o的属性复制到sb的propertype下。
extend(o):(sb函数下),该函数调用的是Ext.extend(sb.o);

Ext.extend(sb, sp, overrides)方法有三个参数,这三个参数有一定的类型要求:
sb 一般情况下是一个类函数。
sp:有两种情况:一种是类函数,另一种是:一个Object对象。
overrides:Object对象,通过Ext.override(sb, overrides);方法覆盖类对象的属性。

通过代码分析,可以看出Ext.extend方法有两个应用:
第一:
因为js没有重构语法,所以我们没办法定义js方法的重构,而上边这个extend方法,可以说是一种重构的实现。因为,我们通过代码的分析,我们可以总结出extend方法的参数传

递方式。(用面向对象语言来表示的话,如下结构)
1:extend(Calss sb,Object sp);
2:extend(Calss sb,Class sp);
3:extend(Calss sb,Class sp,Object overrides);
第一种方式目的是定义一个类函数,这个类函数的父类为sb类函数,属性方法的定义在sp对象中完成。
比如: var Student = Ext.extend(Person,{
    constructor:function(old){
  this.age=old;
 },
   name:'sam'}
})
其实通过
  if(Ext.isObject(sp)){
                    overrides = sp;
                    sp = sb;
                    sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
                }

我们可以看出Ext.extend

只有在sp.constructor==Object.prototype.constructor的时候,才创建并返回一个函数,该函数就一句话,

就是调用sb(即父类构造函数)

如果sp.constructor==Object.prototype.constructor

那么sp应该是这样,是一个对象直接量,或者new Object方式创建的对象,且它们都没有显示定义

constructor方法。

以下这几种情况都不会有sp.constructor==Object.prototype.constructor。

1:var obj = new Object(); 

obj.constructor=function(){...};

Ext.extend(sb,obj) //extend 返回的类就是constructor函数

2: var obj = {

constructor:function(){...}

};

Ext.extend(sb,obj) //extend 返回的类就是constructor函数

3: var obj = new function(){...}();  

Ext.extend(sb,obj) //extend返回的类就是这个匿名函数

4: var obj = new function(){

this.constructor=function(){...} 

}();

Ext.extend(sb,obj) //extend 返回的类就是constructor函数。


总结 :其实很简单,Ext.extend这么做的目的是要说,定义一个类,构造函数就是constructor方法,如果没显示定义这个方法,那么类就使用父类函数作为新类的构造函数。


var A=function(){
   alert("this is a");
}
var B=function(){
   alert("this is b");
}

var SubA = Ext.extend(A,new B());
var subA = new SubA();//这里就会弹出 this is  a 的提示。
第二种方式:修改现有类的类结构
2:extend(Calss sb,Class sp);
这个方法的目的其实之一种包装,是将sb继承于sp下,不管sb是不是ext框架下的类,在这个方法执行后sb就成了ext框架
下的类结构了
3:extend(Calss sb,Class sp,Object overrides);
除了有第二种方法的功能外,还额外的给sb添加或覆盖新的方法或属性
Ext.extend(Person,DongWu);
Ext.extend(Person,DongWu,{sex:'man'});

posted on 2010-06-29 07:07 sam.chuan.yang 阅读(1106) 评论(0)  编辑  收藏 所属分类: javascript 笔记


只有注册用户登录后才能发表评论。


网站导航: