dojo生命周期管理

今天简单看了一下dojo的declare源代码,发现了实例化化的代码,才真正理解了生命周期的原理,以前从网上只是看到了生命周期的几个方法,如果组织的一直没有发现,今天终于发现了。
declare他主要是dojo的继承机制,由于dojo支持多继承方式,所以dojo采用了C3算法,将多个继承关系转换为单继承链,然后满足继承要求。同时在继承的时候

ctor.prototype = proto;
proto.constructor = ctor;

其中ctor为返回的对象,也就是说他会自动执行自身的constructor方法,完成对象的构建,构建完成在以后,执行对象本身,本身的代码如下定义

bases[0] = ctor = (chains && chains.constructor === "manual") ? simpleConstructor(bases) :
(bases.length == 1 ? singleConstructor(props.constructor, t) : chainedConstructor(bases, t));


其中多继承方式的构造如下定义

// chained constructor compatible with the legacy declare()
function chainedConstructor(bases, ctorSpecial){
return function(){
var a = arguments, args = a, a0 = a[0], f, i, m,
l = bases.length, preArgs;

if(!(this instanceof a.callee)){
// not called via new, so force it
return applyNew(a);
}

//this._inherited = {};
// perform the shaman's rituals of the original declare()
// 1) call two types of the preamble
if(ctorSpecial && (a0 && a0.preamble || this.preamble)){
// full blown ritual
preArgs = new Array(bases.length);
// prepare parameters
preArgs[0] = a;
for(i = 0;;){
// process the preamble of the 1st argument
a0 = a[0];
if(a0){
f = a0.preamble;
if(f){
a = f.apply(this, a) || a;
}
}
// process the preamble of this class
f = bases[i].prototype;
f = f.hasOwnProperty("preamble") && f.preamble;
if(f){
a = f.apply(this, a) || a;
}
// one peculiarity of the preamble:
// it is called if it is not needed,
// e.g., there is no constructor to call
// let's watch for the last constructor
// (see ticket #9795)
if(++i == l){
break;
}
preArgs[i] = a;
}
}
// 2) call all non-trivial constructors using prepared arguments
for(i = l - 1; i >= 0; --i){
f = bases[i];
m = f._meta;
f = m ? m.ctor : f;
if(f){
f.apply(this, preArgs ? preArgs[i] : a);
}
}
// 3) continue the original ritual: call the postscript
f = this.postscript;
if(f){
f.apply(this, args);
}
};
}


看到其中的注释1,2,3了吗,那就是他的实例化的过程,也就是可以扩展的定义步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值