Extjs 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){
            	//判断sp是否为一个对象,即overrides是否为空。
            	//如果sp参数为对象 (用{}传递),即当overrides为空的时候,也即参数为两个的时候(第一个参数为父类,第二个参数为重写的object)。
                if(typeof sp == 'object'){
                    overrides = sp;
                    sp = sb;
                    //如果overrides中重写了constructor,那么调用重写的constructor函数,将sb赋值为此函数。
                    //如果overrides中没有重写construtor,那么调用父函数的构造函数。即使this拥有父类中的所有构造方法,并调用,这样构造出组件。
                    //在Component.js里有Ext.apply(this,config)方法,可以使父函数接受arguments里的属性,一一赋值或覆盖。
                    sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
                }
                var F = function(){}, sbp, spp = sp.prototype;
               //下面的实现我老是感觉绕圈子,其目的是用空函数(new F)来暂时代替父类的构造函数(此构造函数里面
               //只有父函数的prototype属性),所以这样可以不用继承父类中不必要的属性。与此同时,也能正确绑定this。
                F.prototype = spp;
                // 继承父类,构造sb的prototype。
                sbp = sb.prototype = new F();
                sbp.constructor=sb;
                // 设置子类的父类--定义supperclass对象,将父函数的prototype对象指向supperclass
                sb.superclass=spp;
                if(spp.constructor == oc){
                    spp.constructor=sp;
                }
                //子函数提供override方法,以方便子类的对象重载属性。
                sb.override = function(o){
                    Ext.override(sb, o);
                };
                sbp.override = io;
                //将overrides中的属性复制到子函数的原型(prototype)中。
                Ext.override(sb, overrides);
                sb.extend = function(o){Ext.extend(sb, o);};
                return sb;
            };
        }()

 

 

 

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

上面的代码就不多做解释了,复制第二个参数的方法到第一个参数的prototype中。

 

例如:

PersonListGridPanel = Ext.extend(Ext.grid.GridPanel, {
	
	constructor : function() {

		PersonListGridPanel.superclass.constructor.call(this, {

			renderTo : Ext.getBody(),
			region : "center"
                        ...
                 });
        }
});   
 

override将会复制第二个参数 ,即{}中的所有属性到PersonListGrid中的prototype中去


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐