由于公司提交数据会过滤代码。
只能加入解读文字部分。
原文件为 ext-3.3.0\src\ext-core\src\core\Ext.js
//内部函数 var io = function(o){ for(var m in o){ this[m] = o[m]; } }
//所有的浏览器都有Object.prototype.constructor函数 //最原始的Object 初始化函数 var oc = Object.prototype.constructor;
//这个函数才是实际运行的extend函数。上边是此函数的局部变量和局部函数 //两参数和三参数的调用中,参数subclass,和superclass的对象位置是错开的 //传入参数的命名是按传入三个参数的方式命名, sb = subclass, sp = superclass, overrides = overrides //传入两参数时 sb = superclass, sp = overrides return function(sb, sp, overrides){
//没有传第三个参数的情况 //sb 参数1 是supperclass //sp 参数2 是subclass //在此时 参数名的意义和实际是相反的,if操作的主要意义在于将参数对应到正确的参数名上。 //在if运行完后参数对应的意义才正确 if(typeof sp == 'object'){ overrides = sp; sp = sb; //如果一个普通的对象,constructor == Object.prototype.constructor sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);}; }
//sp 是一个function 同时也是一个类 可用new进行操作。 //生成superclass的prototpye的实例对象,并将其付给subclass作为其prototype //生成一个干净的初始化函数,不用superclass的初始化函数,以防将prototype的内容改变。 var F = function(){}, sbp, spp = sp.prototype; // 将superclass的prototype传递给干净的function F F.prototype = spp; //实例化,其主要目的是将prototype进行copy,创建副本 //不然subclass,和supperclass的prototype是同一对象,后续对prototype的属性改动将会同时影响到subclass,和supperclass. sbp = sb.prototype = new F();
//保证类的prototype中constructor为自己的构造函数。 //这是Ext的一条默认规则:Ext中的类,其prototype中的constructor必须为其构造函数 sbp.constructor=sb; sb.superclass=spp; //对其supperclass也要,保证上述规则 if(spp.constructor == oc){ spp.constructor=sp; }
sbp.superclass //返回其父类的prototype sbp.supr //返回其父类的prototype
//Object级的override sbp.override = io;