当前位置: 代码迷 >> Web前端 >> EXT分析(一)-extend继承函数
  详细解决方案

EXT分析(一)-extend继承函数

热度:82   发布时间:2012-11-20 09:55:43.0
EXT分析(1)--extend继承函数
由于公司提交数据会过滤代码。
只能加入解读文字部分。
原文件为 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;