[ExtJS3.2源码每天一小时](2)ext-base.jsExt的继承与覆盖不再神秘

本文深入探讨了JavaScript中实现继承和覆盖的方法,包括如何通过原型链实现extend继承,并详细解析了override覆盖的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.extend继承,继承的原理相对来说比较复杂,从根本来说就是引用之间的变更,原型链的应用,稍不注意就可能绕晕了,所以看这块代码的时候头脑一定要清晰。
function extend(sb, sp, overrides) {

//如果sp是对象,不是类,那么使用extend函数时,直接把覆盖项都放于sp中
if (typeof sp == 'object') {
overrides = sp;//如果sp是对象,那么overrides必为undefined,因为可以把覆盖项都放于sp中,于是将sp的内容作为overrides。
sp = sb;//由于现在sb需要继承的属性来自overrides,那么丢弃sp的引用,令sb、sp持有相同的引用。
//如果overrides的构造器不是默认的构造器,说明用户要覆盖构造器,那么子类使用overrides的构造器,否则指定为子类自己的构造器
sb = overrides.constructor != oc ? overrides.constructor : sb.constructor;
}
//如果上面的if成立,那么sb=sp,下面的原型对象引用的变更将没有任何的意义。再if不成立的条件下,下面的代码才有意义。
var F = function() {
}, sbp, spp = sp.prototype;
F.prototype = spp;
sbp = sb.prototype = new F();
//因为sb的原型对象被F的对象覆盖,那么原型对象的构造器目前是F的,必须要赋值回sb
sbp.constructor = sb;
//给sb的superclass属性赋值
sb.superclass = spp;

//为了下面给sbp的superclass属性复制后,能够通过父类的原型能够执行父类的构造器,把原型中的Object构造器换为Function构造器
if (spp.constructor == oc) {
spp.constructor = sp;
}
//给sb的原型的superclass属性赋值,sb的对象可以调用superclass()获得父类的原型
sbp.superclass = sbp.supr = (function() {
return spp;
});
//将overrides中的东西覆盖到sb中
override(sb, overrides);

//给sb添加自身的继承方法,可以直接调用sb.extend(o);
sb.extend = function(o) {
return ex(sb, o);
};
return sb;

2. override覆盖

//origclass原始类,overrides包含各个覆盖项的对象

override : function(origclass, overrides){
if(overrides){
var p = origclass.prototype;
Ext.apply(p, overrides);//通过apply方法,将覆盖项覆盖到原始类的原型对象中。
if(Ext.isIE && overrides.hasOwnProperty('toString')){ //既然有上面那句了,为什么还要写下面这三行呢,因为在ie中,for (var method in overrides) 循环中method拿不到toString属性,而恰恰Ext.applay就用的循环指定,所以toString必须单独指定
p.toString = overrides.toString;
}
}
},
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值