部分Dojo常用函数简介(二)——面向对象(OO)及包机制(package system)

每个Ajax 框架都对Javascript 做了扩展,提供了很多常用函数,增强了 Javascript 的开发效率。在这里将对部分Dojo 中的常用函数做简单的介绍。由于Dojo的常用函数较多,也为方便大家阅读,将这些常用函数分为了五个类别分别进行介绍。本文将介绍第二部分的内容:面向对象(OO)及包机制(package system)常用函数。

* 本系列博文的绝大多数内容来自于对dojocampus.org上的dojo reference guide文档的翻译,在此也特别感谢文档的翻译者们:Fei Jia, Zhu Xiao Wen, Li Wen Bing, Zhang Jun, Hu Kuang, Huang Wei, Wu Min Qi, Mo Ying, Cheng Fu, Zhong Si Qi

dojo.require

如果你想使用Dojo作为你的开发工具包,那么dojo.require是你必须要熟练掌握的。Dojo采用了与Java语言类似的命名空间(namespace)、包(package)机制,Dojo的代码都被切分为各个模块存储在各个的包中,如果你需要用到Dojo中的某个模块,那么就需要首先调用dojo.require("modulename")来预先加载该模块,否则的话,script将会抛错提示"dojo.some not defined"。


dojo.require接收一个字符串参数,该参数为要进行加载的模块名。下面是一个简单的示例:

 

// 加载dojo/fx.js: dojo.require("dojo.fx"); // 加载dojox/widget/Toaster.js: dojo.require("dojox.widget.Toaster");

 

另外,由于各个模块之间有相互依赖性存在,用户想逐个判断并加载所有需要的模块是件很困难的事情,因此,dojo.require也提供了一些很不错的特性:

  • 自动载入所有依赖的模块:

例如, dijit.form.NumberTextBox 需要引用 dojo.number ,那么当你使用dijit.form.NumberTextBox时,则不需要再次声明引用dojo.number模块。

  • 预防多次载入:

当某个模块已经载入,再次声明引用相同模块,dojo.require会直接返回,而不会再次加载相同的模块。

  • 通过自定义打包机制快速载入所需模块:

用户可以通过dojo提供的打包机制构建定制化的dojo包,以快速载入模块。你可以通过定制化将会多次使用的模块预加载到dojo中,而由于dojo.require()的预防多次加载机制,你也不需要对代码进行修改。

那么你可能会问,那我是不是需要通过require机制来先载入dojo.require呢?答案当然是不。顶层dojo包中的所有函数都是自动加载的(如dojo.query(),dojo.byId(),等等)。这些都是dojo的核心方法,都会在dojo引用中被频繁使用。就如同Java中的java.lang包,无需显式声明加载。

 

dojo.provide

与dojo.require相对应,dojo.provide是用于提供dojo模块名的函数。每一个Dojo类都必须在源代码文件开始处提供至少一个dojo.provide(),并和文件名相匹配. 例如在"Js/dojo/foo.js"文件中,在调用任何"dojo.require()"前 必须先添加 "dojo.provide('dojo.foo');" 。

 

下面的代码示例假设对应 my/module.js 源文件,请注意dojo.provide的调用始终在dojo.require之前。

 

dojo.provide("my.module"); dojo.require("dojo.io.script"); //dojo.provide 确保 my.module被创建为JavaScript对象以方便的进行属性赋值 my.module.name = "my module";

 

注意,同一个文件中可以有多个dojo.provide,但在build脚本中一般只使用一个dojo.privide()以正确匹配文件名。

 

dojo.declare

JavaScript和Java不一样,它没有一个类系统,但是Dojo提供了一套模拟Java的类系统的机制:dojo.declare。
dojo.declare 接受如下的三个参数:

 

className: 字符串,可以为null,声明的类的名称,这个类名会被用作创建的构造子的全局名称,如果不指明名称,该类将被认为是匿名的(从V1.4开始),如果指明了名称,那么名字会被存储在创建的原型的属性”declaredClass” 中。

 

superclass:一个对象或对象数组,也可以为null(没有基类),声明了该类的基类,当为该参数为数组时,说明该类有多个基类。

 

props:一个对象,此对象所有的属性将混入到被创建的原型中。

 

另外,通过将一个属性命名为”constructor”,你可以为创建的对象实例增加一个初始化函数。

 

例子:

 

dojo.declare("my.Thinger", null, { constructor: function(/* Object */args){ dojo.safeMixin(this, args); } });

 

这里我们声明了一个不继承任何类的简单的类,名为 my.Thinger 。该类最终含有一个名为 constructor 的构造函数。
你可以这样创建一个 my.Thinger 实例:

 

dojo.declare("my.Thinger", null, { count: 100, constructor: function(args){ dojo.safeMixin(this, args); } }); var thing1 = new my.Thinger(); var thing2 = new my.Thinger({ count:200 }); console.log(thing1.count, thing2.count);

 

dojo.mixin

dojo.mixin用于将对象混合在一起。所谓mixin(混入)是将两个对象从右到左组合起来,覆盖最左边的对象,并且返回混入后的对象给用户。Dojo的这个mixin非常类似于 dojo.extend ,但它只能用于对象,而不像extend显式地扩展一个对象的原型(object.prototype)。


mixin函数修改的是列表中第一个对象,将第二个对象(及以后所有对象)混入到第一个对象中。

 

var a = { b:"c", d:"e" }; dojo.mixin(a, { d:"f", g:"h" }); console.log(a); // b:c, d:f, g:h

 

如果您希望创建一个全新的混合对象,有如下几种做法:第一种,用dojo.clone克隆现有对象,然后再混入:
var newObject = dojo.mixin(dojo.clone(a), b);

 

另一种做法是,可以用一个空对象作为第一个参数,然后将其他对象混入到这个空对象里面。您可以不断重复这个过程:

 

var newObject = dojo.mixin({}, b); dojo.mixin(newObject, c); dojo.mixin(newObject, dojo.mixin(e, f)); // 可以继续不断混入

 

只要记住作为第一个参数的对象实例总是会被改写,并且越右面的对象,其优先级越高。

 

dojo.extend

dojo extend 的工作原理十分类似 dojo.mixin, 区别在于它会直接作用于一个对象的原型(prototype)之上。和mixin一样,dojo.extend将其参数最右侧的对象的成员直接合并进入第一个参数的对象。


我们可以利用extend方法来扩展一个现有类的功能:

 

dojo.require("dijit.TitlePane"); dojo.extend(dijit.TitlePane, { randomAttribute:"value" });

 

dojo.exists

dojo.exists用于检查一个字符串中利用点号’.’分隔的所有对象是否存在, 例如 A.B.C 。dojo.exists 是一个很方便的方法,特别是在需要检测一个较长的对象路径时。它接受一个字符串作为它的第一个参数,该方法将试图沿着此字符串所表示的路径去检测此路径上所含的对象是否存在。第二个参数是可选的,可以设定一个对象作为前面所设的字符串所表示的路径的根。如果忽略第二个参数,则它将会默认使用全局对象作为根来进行检索。字符串中每个被’.’分隔的部分都会被检测是否定义过,只有当该路径上所有对象都存在时此方法才会返回true。


dojo.exists 的第一个参数是一个字符串表示要检测的对象路径,第二个参数是可选参数,是作为搜索该对象路径的根对象。返回值为一个boolean值。

 

// 检测一个控件是否存在 var widgetType = "form.Button"; var myNamespace = docs; if( dojo.exists(widgetType, myNamespace) ){ console.log( "There's a docs.form.Button available"); }else if( dojo.exists(widgetType, dijit) ){ console.log( "Dijits form.Button class is available"); }else{ console.log( "No form.Button classes are available"); }

 

dojo.clone

用于克隆对象或DOM节点,该函数返回一个克隆后的新对象。

 

// 克隆对象 var obj = { a:"b", c:"d" }; var thing = dojo.clone(obj); // 克隆数组 var newarray = dojo.clone(["a","b","c"]);

 

以上就是部分Dojo的面向对象(OO)及包机制(package system)常用函数,在下一部分中,会介绍关于页面生命周期及DOM相关的一些常用函数。

 

你可能感兴趣的:(部分Dojo常用函数简介(二)——面向对象(OO)及包机制(package system))