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中去