`
yahaitt
  • 浏览: 756025 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

透析Extjs的Ext.js源码(五)分析继承的实现

阅读更多
ext中有关继承的实现的关键代码如下:(Ext.js中)

extend:
extend : function(){
            // inline overrides
            var io = function(o){
                for(var m in o){
                    this[m] = o[m];
                }
            };
            var oc = Object.prototype.constructor;
            
            return function(sb, sp, overrides){
                if(typeof sp == 'object'){
                    overrides = sp;
                    sp = sb;
                    sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
                }
                var F = function(){}, sbp, spp = sp.prototype;
                F.prototype = spp;
                sbp = sb.prototype = new F();
                sbp.constructor=sb;
                sb.superclass=spp;
                if(spp.constructor == oc){
                    spp.constructor=sp;
                }
                sb.override = function(o){
                    Ext.override(sb, o);
                };
                sbp.override = io;
                Ext.override(sb, overrides);
                sb.extend = function(o){Ext.extend(sb, o);};
                return sb;
            };
        }()


override:
override : function(origclass, overrides){
            if(overrides){
                var p = origclass.prototype;
                for(var method in overrides){
                    p[method] = overrides[method];
                }
            }
        }


Ext.apply:
Ext.apply = function(o, c, defaults){
    if(defaults){
        // no "this" reference for friendly out of scope calls
        Ext.apply(o, defaults);
    }
    if(o && c && typeof c == 'object'){
        for(var p in c){
            o[p] = c[p];
        }
    }
    return o;
};


最关键的是extend部分的代码,它使得如果子类没有constructor(或者说子类的constructor就是个默认的Object),那么当new一个子类的时候,会调用他的父类的构造器,因此,我们看到Panel是直接通过Ext.Panel = Ext.extend(Ext.Contailer,{...});的方式直接定义的,在new Panel({...})的时候就能层层进去一直到有构造器的超类Ext.Component,并执行这个超类的构造器里的代码。而Ext.Component的构造器代码中有this.initComponet()方法,这样就能够调用子类的initComponent()方法,而子类的initComponent()方法中都有 子类名.superclass.initComponent();这样的代码来调用父类的init方法,这样我们在new一个子类的后就能够直接初始化了所有的信息。
extend中最关键的一句话是:
sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
它表示了执行父类构造器的原因,
new对象时,就是执行这个function(){sp.apply(this, arguments);}方法,
sp.applay()执行时,父类构造器就会马上被执行。


比较并执行下面的代码就可以理解了上面说的内容了:

1、子类有构造器的情况
Parent = function() {
	alert("parent");
};
Child = function() {
	alert("child");
};
Ext.extend(Child, Parent, {
	init : function() {
		alert("child's init function");
	}
});
var cl = new Child();// 输出结果:child
cl.init();// 输出结果:child's init function



2、子类没有构造器的情况
Parent = function() {
	alert("parent");
};
Child = Ext.extend(Parent, {
	init : function() {
		alert("child's init function");
	}
});
var cl = new Child();// 输出结果:parent
cl.init();// 输出结果:child's init function
分享到:
评论
4 楼 zlssy 2008-12-13  
顶一个!

经典

深刻
3 楼 slmdyk 2008-08-13  
上面说的没看明白,可是例子看明白了!
所以还是有点懵懂!
不过老师的所有文章我都看了,除非是老师不给我权限的
2 楼 yahaitt 2008-07-15  
呵呵,谢谢支持:)
1 楼 baoyaer 2008-07-15  
lz你太厉害了,总结的也非常深刻,有些类似我的做事风格,抓住最低层的一些东西进行剖析,你的每篇文章我都看了,总结的非常好,谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics