Extのソースコードの解読の一つ-extedの実現


まず例を見ます.

Gmis.ext.Animal = function() {
	this.run = function() {
		Gmis.util.printMessage("Animal run");
	};
	this.swim = function() {
		Gmis.util.printMessage("Animal swimming");
	};
	this.shout = function() {
		Gmis.util.printMessage("Animal shout");
	}
};

Gmis.ext.Cat = Ext.extend(Gmis.ext.Animal, {
			constructor : function() {
				Gmis.ext.Cat.superclass.constructor.call(this);
			},
			run : function() {
				Gmis.util.printMessage("Cat run");
			}
		});

var cat = new Gmis.ext.Cat();
cat.run();
cat.shout();
同じ機能の第二の例を見てください.

Gmis.ext.Animal = function(name) {
	this.name = name;
};
Gmis.ext.Animal.prototype = {
	run : function() {
		Gmis.util.printMessage(this.name + " 2Animal run");
	},
	swim : function() {
		Gmis.util.printMessage(this.name + " 2Animal swimming");
	},
	shout : function() {
		Gmis.util.printMessage(this.name + " 2Animal shout");
	}
};
Gmis.ext.Cat = function(name,age){
	Gmis.ext.Cat.superclass.constructor.call(this,name);
	this.age = age;
};

Ext.extend(Gmis.ext.Cat,Gmis.ext.Animal, {
			run : function() {
				Gmis.util.printMessage(this.name + " 2Cat run, age: " + this.age);
			}
		});

var cat = new Gmis.ext.Cat("jiafei",3);
cat.run();
cat.shout();
extedのソースコード:

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'){
        	//1、          ,       。
        	//           ,overrides        -     ,
        	//	 sp   Gmis.ext.Animal,sb          constructor(     )
        	//              。              
            overrides = sp;
            sp = sb;
            sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
        }
        //2、  F           
        var F = function(){},
            sbp,//     
            spp = sp.prototype;//     
        //3、F               
        F.prototype = spp;
        //4、        F     
        sbp = sb.prototype = new F();
        //5、                 ,     ??
        sbp.constructor=sb;
        //6、   superclass          ,           .superclass.constructor.call(this,xxx) 
        sb.superclass=spp;
        //7、             Object         ,                   。
        if(spp.constructor == oc){
            spp.constructor=sp;
        }
        sb.override = function(o){
            Ext.override(sb, o);
        };
        sbp.superclass = sbp.supr = (function(){
            return spp;
        });
        sbp.override = io;
        //8、 overrides                    (      ),    F      
        Ext.override(sb, overrides);
        sb.extend = function(o){return Ext.extend(sb, o);};
        return sb;
    };
}(),//      ,     function 
overridesを見てください

override : function(origclass, overrides){
    if(overrides){
        var p = origclass.prototype;
        Ext.apply(p, overrides);
        if(Ext.isIE && overrides.hasOwnProperty('toString')){
            p.toString = overrides.toString;
        }
    }
}
extedは
ここですによって紹介された第6の種類の組み合わせ寄生モード.