Extのソースコードの解読の一つ-extedの実現
4000 ワード
まず例を見ます.
ここですによって紹介された第6の種類の組み合わせ寄生モード.
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の種類の組み合わせ寄生モード.