今天简单看了一下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了吗,那就是他的实例化的过程,也就是可以扩展的定义步骤。
分享到:
相关推荐
此外,合理的生命周期管理和组件实例化策略能够有效地优化应用性能和可维护性。 总的来说,Dojo的生命周期机制和组件管理是其强大功能的重要组成部分。通过理解并熟练掌握这些概念,开发者可以更好地利用Dojo创建...
测试时,会关注部件的生命周期方法和事件处理。 11. **dojo/on**:事件监听模块,提供了统一的事件处理接口。测试时,会通过触发事件来检验代码响应的正确性。 12. **dojo/has**:特性检测模块,用于判断浏览器或...
8. **dojo/Deferred**:在异步编程中,`dojo/Deferred`是处理回调和承诺的重要工具,它可以管理异步操作的生命周期,使得多步骤的异步操作更加清晰。 9. **dijit/form**:Dijit是Dojo的UI组件库,其中`dijit/form`...
每个 Dojo widget 都有一系列生命周期方法,如 `postCreate`、`startup` 和 `destroy`,它们在 widget 的创建、初始化、显示和销毁过程中被调用。理解这些方法有助于正确地管理组件的状态和资源。 ### 5. 测试 ...
理解Widget的生命周期,以及如何自定义Widget是进阶使用Dojo的关键。 4. **数据绑定和数据模型**:Dojo的数据绑定机制可以帮助我们实现视图与数据的动态同步,如`dojo/data`接口和`dijit/form`中的数据绑定。了解`...
它的核心理念是将UI视为由可重用的组件构成,每个组件都有自己的状态和生命周期方法。React使用JSX语法,这是一种JavaScript的扩展,允许我们在JavaScript代码中混合HTML,使得编写UI更加直观。 在这个"dojo-react...
Dojo小部件有明确的生命周期方法,如`startup`(启动)、`destroy`(销毁)等,确保在正确的时间执行必要的操作。例如,`startup`方法通常用于在所有子节点加载完成后设置初始状态。 3. 数据绑定和声明式编程: ...
每个Dojo控件都是一个JavaScript类,通常继承自_Widget或其子类,这些类提供了控件的生命周期管理函数,如构造函数、postCreate等,允许开发者在特定阶段插入自定义逻辑。 以_Dojo基类为例,`preamble`和`...
在"rust-dojo"的实践中,你将学习如何通过注解和类型推断来控制引用的生命周期,确保引用始终指向有效的内存位置。 Rust的函数和闭包也值得一提。Rust支持高阶函数,允许函数接收其他函数作为参数或返回函数。闭包...
3. 进程间通信:学习如何创建进程,发送和接收消息,以及如何使用链接和监控来管理进程生命周期。 4. Map和Enum模块:掌握Elixir的映射(Map)数据结构和Enum模块,用于处理集合的实用函数。 5. Plug框架:了解如何...
在Hr系统中,Spring不仅用于管理对象的生命周期,还用于整合其他组件,如Struts和Hibernate,形成一个完整的解决方案。此外,Spring的数据访问抽象层(DAO)使得数据库操作变得简单易行。 最后,Hibernate作为一款...
1. **学习React基础知识**:掌握如何创建组件,理解props(属性)和state(状态),以及生命周期方法。 2. **实践JSX语法**:学习如何在JSX中嵌入表达式,创建条件渲染和循环。 3. **理解React Hooks**:React 16.8...
它通过所有权系统、生命周期和借用规则来确保内存安全。这使得Rust成为编写低级别系统代码、网络服务器、游戏引擎等高性能应用的理想选择。 "dojo-rust"项目可能包含一系列的练习和挑战,涵盖了Rust语言的基础到...
7. **容器的生命周期管理**:Guice等IOC容器不仅负责对象的创建,还管理其生命周期,如初始化、销毁等,这有助于资源的有效管理。 8. **扩展性与灵活性**:通过IOC,可以方便地更换或添加新的组件,增强系统的扩展...
理解并管理portlet生命周期对于优化性能和实现正确功能至关重要。 5. **Portlet配置**:portlet可以在门户服务器上进行配置,调整显示设置、安全参数、默认视图等,以满足不同用户需求。 6. **portlet通信**:...
在React的类组件中,有多个生命周期方法,例如`componentDidMount()`、`componentDidUpdate()`和`componentWillUnmount()`等。这些方法在组件的不同阶段被调用,允许开发者在特定时刻执行操作,如数据获取、DOM操作...
8. **生命周期**:Action对象有其特定的生命周期,包括实例化、初始化、处理请求、清理和销毁等阶段。开发者可以利用这些生命周期方法来定制行为。 9. **拦截器**:Struts 2引入了拦截器的概念,可以实现如日志记录...
JSF提供了一系列的UI组件和生命周期管理,与ZK不同的是,JSF主要依赖服务器端处理。 **ZK 3.5.1版本** "zk手册3.5.1.chm"文件可能是ZK框架3.5.1版本的官方文档,其中可能包含了详细的API参考、示例代码、用户指南...
9. **生命周期管理**:Struts2支持Spring的依赖注入(DI),可以方便地管理Action及其依赖对象的生命周期。 10. **安全考虑**:Struts2对一些常见的安全漏洞如XSS、CSRF提供了防护措施,但开发者仍需关注并适当地...
8. **生命周期管理**:Struts框架会管理Action实例的生命周期,通常采用线程安全的方式,以避免并发问题。 9. **拦截器(Interceptors)**:Struts2引入了拦截器的概念,它们在Action执行前后进行额外的操作,如...