创建并增强Dojo类
——译自http://www.sitepen.com/blog/2010/07/01/creating-and-enhancing-dojo-classes/
原作者David Walsh
像所有一流的JavaScript工具包一样,Dojo致力于将类做得尽可能灵活,因为它知道不同的用户可能对一个类及其方法是如何工作的抱有完全不同的看法。幸运的是,Dojo提供了大量的方法使您能够继承或修改类。现在我们就来研究其中的一些方法,它们可以让你随心所欲地摆弄Dojo类。
创建Dojo子类
创建Dojo类或子类的一个典型方法是用dojo.declare。dojo.declare把类注册到你所指定的名字空间中,并且能够继承任意数量的类(由第二个参数传入)。
以下代码展示了创建子类的基本写法:
以上代码创建的新类davidwalsh.Menu就是一个新的自定义Dojo类,它继承了dijit.Menu类的所有方法和属性,而且还添加了一个新的自定义属性以及一个自定义方法,可以用来做任何事情。既然我们已经知道如何创建子类了,那就让我们来写一个实用一点的davidwalsh.Menu吧:
davidwalsh.Mene是dijit.Menu类的增强版。它具有两个新的选项,并重载了一个dijit.Menu的方法。其目的在于提供一种在鼠标悬停时而非单击时打开弹出菜单项的菜单。
你可能在想,怎样在子类的方法里调用父类的方法呢?这也很简单:
可见,建立子类易如反掌。但如果你只需要修改一个现存的Dojo类,又该怎么做呢?答案是打补丁!
原型修改(Monkey Patching)
有时,继承一个现有的Dojo类并不是最好的选择(甚至有可能根本无法这样做)。你很可能处于这样一个境地,只能给现有的Dojo类打补丁,这时Monkey Patching就是最理想的选择。所谓Monkey Patching就是一个修改现有对象(在这里指Dojo类)的原型的过程。这一做法的优点有:
- 这个类型的所有现存对象都被同时修改了。
- 不需要访问Dojo核心文件.
- 由于你并没有修改Dojo的核心文件,升级Dojo版本就变得相对容易,因为你不用跟踪你以前的改动。
- 你的补丁也将具有更好的可移植性,因为它们不是直接放在Dojo核心文件里。
以下代码展示了Monkey Patching的模式:
现在我们来看一个实际例子。我最近正在使用FilteringSelect控件,我发现如果srcNode(也就是select元素)里的第一个option元素没有value属性(或者value为空字符串),那么这个元素的label就不会显示。这是一个非常奇怪的bug,并且肯定不是一个符合用户预期的行为。我所能做的就是给这个控件类的postMixInProperties方法打上补丁来修复这个问题:
这只是使用Monkey Patching的好例子之一。虽然打补丁可能看起来属于不太优雅的技术,但它的确是定制你手里Dojo包的一个必要方法。
扩展Dojo类
Dojo.extend方法允许我们为类的原型添加新方法,从而为该类的所有实例提供这些方法。如果传给dojo.extend的某个方法在类中已经存在同名方法,那它将覆盖这个原有方法。
下面的例子展示了如果和扩展dijit.Menu类,从而使弹出菜单在鼠标悬浮在标签上时显示,而不是单击时。
注意到原有的onItemHover方法并没有被保存下来并在以后使用,而是整个原型都被重写了。因为我们正是要抛弃这个方法原来的功能。现在我们拥有了一个满足我们需求的dijit.Menu类,并且我们的Dojo包中的文件并没有受到干扰。
继承,扩展,还是打补丁?
对于一个类,何时应该扩展何时应该补丁并没有一个硬性的规定。但我的确有几点建议:
- 不要修改任何Dojo核心文件,必要时打补丁或做扩展。
- 如果你需要访问原有的的原型对象,使用打补丁的方法。
- 当希望在多个项目之间重用代码时,使用你自定义的名字空间创建子类。
- 如果可移植性是一个很重要的因素,使用扩展类的方法。
尽量扩展!
扩展Dojo类是修复bug、增强Dojo内置类、以及避免重复代码的最佳途径。Dojo里没有任何限制,除了那些你强加给它的!
分享到:
相关推荐
3. **底层API和兼容性**:Dojo的事件系统、I/O API和通用语言增强功能构成了一个强大的编程环境,允许编写简洁且风格一致的JavaScript代码。 4. **单元测试**:Dojo提供的工具支持编写命令行式的单元测试,确保代码...
DOJO的`dojo/_base/declare`和`dojo/_base/lang`提供了类和函数的声明,有助于编写可维护的代码。此外,DOJO的`dojo/ready`和`dojo/domReady!`可以帮助确保脚本在DOM完全加载后执行,避免加载顺序问题。 9. **DOJO...
在深入理解Dojo之前,我们需要了解JavaScript在网页开发中的核心地位以及它如何通过库和框架来增强功能。 1. Dojo基础: Dojo 的核心模块是 "dojo/_base",它包含了JavaScript的基础功能,如事件处理、DOM操作、...
3. **对象和类**:Dojo提供了一套面向对象的编程模型,包括`dojo/_base/lang`中的函数增强、对象创建和继承。`dojo/_base/declare`用于创建类,支持多重继承。 4. **DOM操作**:`dojo/dom`和`dojo/query`模块提供了...
1. **提升 Web 应用程序的可用性和功能性**:通过支持 AJAX 技术,Dojo Toolkit 能够让 Web 应用更加响应用户操作并具备更多功能。 2. **强大的基础设施支持**:Dojo 提供了大量的底层设施,包括隐藏 XMLHttpRequest...
DOJO 允许开发者通过 `dojo/has` 功能检测和 `dojo/extend` 扩展对象来适应不同浏览器的差异,增强框架的兼容性。 9. **DOJO 工具集** 这个版本的 DOJO-DEMO 中包含了官方提供的各种示例,可以帮助开发者理解 ...
同时,1.8版本改进了Dojo的DOM操作和事件处理,增强了对移动设备的支持,并提供了更丰富的UI组件。 AMD模块系统允许开发者按需加载依赖,减少了整体页面的加载时间。在Dojo 1.8的chm文档中,你可以找到如何使用...
"dojo-release-1.10.0"是Dojo框架的一个特定版本,源码的发布使得开发者能够深入理解Dojo的工作原理并进行定制化开发。 1. **模块化系统(AMD)** Dojo 1.10.0 使用了Asynchronous Module Definition(AMD)加载...
结合Dojo,开发者可以利用Dojo的高级AJAX功能来增强Struts2应用的用户体验,比如实现页面的部分刷新、异步数据交换等。 Dojo的核心组件包括dojo.js,这是一个包含Dojo基础功能的主文件,如加载机制、DOM操作、事件...
8. **国际化 (dojo.i18n)**:Dojo 支持国际化和本地化,允许开发者轻松创建多语言应用。 9. **Dojo Build System**:Dojo的构建系统允许优化和打包代码,减少HTTP请求,提高加载速度。 在提供的"ajax"子文件中,你...
Struts2-dojo-plugin-2.2.1.jar 是一个针对Apache Struts2框架的扩展插件,主要用于增强Struts2应用的用户界面交互性,特别是通过集成Dojo JavaScript库来提供丰富的AJAX功能和用户体验。这个插件是Struts2与Dojo ...
总的来说,dojo Toolkit提供了一个全面的开发环境,涵盖了Web应用开发的各个方面,无论是简单的功能增强还是复杂的组件构建,都可以借助dojo高效完成。通过深入学习和实践,开发者可以充分利用dojo的强大功能,提高...
`dojo/aspect`模块则提供了面向切面编程的能力,方便拦截和增强方法调用。 总的来说,Dojo是一个全面的JavaScript框架,它为Web开发提供了众多实用工具和组件。通过学习和实践这些基本实例,初学者可以逐步深入理解...
Dojo JS框架是一款备受开发者喜爱的前端开发工具,其最新版本带来了更多优化和增强的功能,旨在提高Web应用程序的性能和可维护性。Dojo不仅仅是一个简单的JavaScript库,它是一个全面的开发框架,提供了丰富的功能集...
1. **Dojo模块系统**:Dojo采用AMD(Asynchronous Module Definition)模式,允许异步加载和组织代码,这使得项目结构清晰,可维护性增强。在源代码中,可以看到如何使用`require`和`define`来导入和定义模块。 2. ...
在"HelloWorld"示例中,开发者通常会展示如何引入Dojo库,创建一个简单的函数或者使用Dojo的`dojo/dom`模块来获取和操作DOM元素,然后在页面上显示欢迎信息。这通常涉及到`dojo/domReady!`这个加载器插件,它确保...
它支持GET、POST等多种HTTP方法,并可以处理JSON、XML、HTML等各种数据格式,同时提供了异步处理机制,增强了用户体验。 ### 2. Dojo Toolkit 的核心组件 - **dojo/_base**: 包含Dojo的基础功能,如事件处理、DOM...
4. **选择器增强**:引入了类选择器、ID选择器、伪类和伪元素,使得更复杂的样式规则得以实现。 5. **多列布局**:`column-count`和`column-gap`等属性允许创建多列布局,适应不同屏幕尺寸。 接下来,我们转向Dojo ...
例如,Dojo的Grid组件可以轻松创建动态数据展示表格,而Dialog组件则用于创建弹出对话框。 数据绑定是Dojo中连接UI与数据模型的机制,允许开发者在视图和模型之间建立双向绑定。当模型数据改变时,视图会自动更新,...