在原生的js中是不可以创建类的,没有class这个关键字,但是在dojo中,dojo自定义了一个模块叫做dojo/_base/declare,用这个模块我们可以创建自己的类,实现面向对象编程。

单继承例子:

define(["dojo/_base/declare"],function(declare){
return declare("namespace.Person",null,{
name:null,
age:null,
constructor: function(args){
declare.safeMixin(this,args);
},
toString:function(){
return this.name+":"+this.age
}
})
})
//调用自定义的类:
require(["js/person"], function(Person) {
var p=new Person({
name:"wpx",
age:20
});
alert(p.toString())
});

多继承例子:

define(["dojo/_base/declare"], function(declare){
var VanillaSoftServe = declare(null, {
constructor: function(){
console.log("adding soft serve");
}
});
var OreoMixin = declare(null, {
constructor: function(){
console.log("mixing in oreos");
},
kind: "plain"
});
var CookieDoughMixin = declare(null, {
constructor: function(){
console.log("mixing in cookie dough");
},
chunkSize: "medium"
});
//继承VanillaSoftServe, OreoMixin, CookieDoughMixin三个类
return declare([VanillaSoftServe, OreoMixin, CookieDoughMixin],{
constructor: function(){ console.log("A blizzard with " + this.kind + " oreos and " + this.chunkSize + "-sized chunks of cookie dough."   );   } });
});

通过“return declare([VanillaSoftServe, OreoMixin, CookieDoughMixin]......;”来返回我们所定义的类(widget),然后在其它的地方通过“require”或者“define”来指明变量引用该类(widget)。数组里面的对象“[VanillaSoftServe, OreoMixin, CookieDoughMixin]”是该自定义类的基类。需要强调一点,这里的declare省略了第一个变量:类的名称,即:“declare("pkg.MyClassName", [VanillaSoftServe, OreoMixin, CookieDoughMixin]......;”,如果设定这第一个变量,它会将这个字符串存储到该类的“declaredClass”变量中,同时会将"pkg.MyClassName"作为一个全局的变量用于今后方便构建该类的对象。

这段代码返回的信息为:

adding soft serve
mixing in oreos
mixing in cookie dough
A blizzard with plain oreos and medium-sized chunks of cookie dough.

以下是几种常用的写法:

1.声明一个类并将该类返回:

 define(["dojo/_base/declare", "extension/bussiness/ModuleBussiness"]
, function (declare, ModuleBussiness) {
var instance = declare(null, {
//构造函数
constructor: function (data) {
this.data = data;
},
action: function () {
ModuleBussiness.LayerToc();
}
});
return instance;
});

设置该模块的名称为ModuleLayerTocCommand,则调用方式为:

require(['ModuleLayerTocCommand'], function (command) {
var command = new command(params);
command.action();
});

2.直接返回自定义类:调用方法同样是实例化后直接调用方法。

define(["dojo/_base/declare", "dojo/topic", "walk/bussiness/DrawToolBussiness", "com/events/EventManager"]
, function (declare, Topic, DrawToolBussiness, EventManager) {
return declare(null, {
//构造函数
constructor: function (geoType, distance, redraw) {
this.geoType = geoType;
this.distance = distance;
this.redraw = redraw;
},
action: function (callbackSuc) {
EventManager.removeEvent();
EventManager.deactivateMapTool();
var params = {
geoType: this.geoType,
distance: this.distance,
redraw: this.redraw
};
DrawToolBussiness.DrawBuffer(params, callbackSuc);
},
actionBuff: function (parm) {
EventManager.removeEvent();
EventManager.deactivateMapTool();
DrawToolBussiness.DrawBuffer(parm.params, parm.callbackSuc);
}
});
});

3.使用单例模式:

define(['dojo/_base/declare', 'dojo/topic', 'dojo/dom-construct', 'dojo/dom-style', 'dojo/dom', 'dojo/on', 'dojo/domReady!'],
function (declare, topic, DomConstruct, DomStyle, dom, on) {
var instance = declare(null, {
constructor: function (kwArgs) {
if (instance.Instance) {
throw new Error('only one instance can be created');
}
},
showProcess: function (container, title) {
title = title || "正在加载...";
var div = "<div id='ProcessBarDivCover' style='width:100%;height:100%;position:absolute;left:0px;top:0px;z-index:999991;background:#000;-ms-filter:alpha(opacity=15);filter:alpha(opacity=15); opacity:0.15;text-align:center;'></div>"
var processBardiv = '<div id="ProcessBarDiv" style="background:url(themes/default/images/loading_background.png); width:90px; height:85px; left:50%;top:50%;position:absolute;z-index:999992;margin:-43px 0 0 -45px">'
+ '<img src="themes/default/images/loading.gif" alt="" style=" display:block; width:40px; margin:12px auto 0 auto" />'
+ '<div style=" color:#fff; font-size:12px; text-align:center; margin-top:8px">' + title + '</div> '
+ '</div>';
//控制父级定位
if (container) {
var position = DomStyle.get(container, "position");
if (position == undefined || position == "" || position == "static") {
DomStyle.set(container, "position", "relative");
}
DomConstruct.place(div, container, "last");
DomConstruct.place(processBardiv, container, "last");
}
else {
$(document.body).append(div);
$(document.body).append(processBardiv);
}
var $this = this;
on(dom.byId("ProcessBarDivCover"), "dblclick", function () {
var tip = confirm("是否取消当前操作?");
if (tip) {
$this.closeProcess();
$this.Cancel();
}
});
},
closeProcess: function () {
DomConstruct.destroy("ProcessBarDiv");
DomConstruct.destroy("ProcessBarDivCover");
},
Cancel: function () {///取消时候调用事件 }
});
//单例
if (instance.Instance == undefined || instance.Instance == null) {
instance.Instance = new instance();
}
return instance;
});

☆☆☆Dojo中define和declare的结合使用的更多相关文章

  1. ORACLE中声明变量:define variable declare

    在sqlplus 环境中,声明变量的关键字:define variable declare 一.define关键字(host变量) host变量的作用是一个替换作用,是主机环境与oracle进行交互的 ...

  2. require、module、exports dojo中的三个特殊模块标识

    查看dojo源码过程中,发现这三个模块名并不以dojo.dijit.dojox开头,在dojo加载器中属于特殊模块名. require 这是一个上下文智能的加载器. 我们通过dojoConfig配置了 ...

  3. Oracle 变量 之 define variable declare 用法及区别

    Oracle 变量 之 define variable declare 用法及区别 Table of Contents 1. 扯蛋 2. define和accept 3. variable 3.1. ...

  4. Dojo初探之2:设置dojoConfig详解,dojoConfig参数详解+Dojo中预置自定义AMD模块的四种方式(基于dojo1.11.2)

    Dojo中想要加载自定义的AMD模块,需要先设置好这个模块对应的路径,模块的路径就是这个模块的唯一标识符. 一.dojoConfig参数设置详解 var dojoConfig = { baseUrl: ...

  5. dojo中的xhrPost请求(JSON)

    dojo中的xhrPost请求 dojo.xhrPost({ url:"../area.action", content:{ areaCode:areaCode }, handle ...

  6. dojo中获取表格中某一行的某个值

    dojo中经常出现对表格中的某行进行操作,如单击某行修改.删除等.那怎样获取某行的唯一标示呢? 如查询表格中的某列有个userId,并且这个是唯一的,那么可以通过它来访问这一列 具体操作代码如下: v ...

  7. PHP中define和defined的区别

    PHP中define和defined的区别 对于初学者会混淆这两个函数 1.define用来定义一个常量,常量也是全局范围的.不用管作用域就可以在脚本的任何地方访问 常量.一个常量一旦被定义,就不能再 ...

  8. C++中#define用法

    http://blog.sina.com.cn/s/blog_686188ef0100klku.html #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一 ...

  9. c/c++中define用法详解及代码示例

    https://blog.csdn.net/u012611878/article/details/52534622   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

随机推荐

  1. svn git 的区别(别再问我了)

    这篇主要是谈谈两者的区别,至于谁优谁劣看官自己思考吧! 把第一条理解到位思想到位了做起来才会有的放矢,其他几条都是用的时候才能体会到 1) 最核心的区别Git是分布式的,而Svn不是分布的.能理解这点 ...

  2. 汇总:unity中弹道计算和击中移动目标计算方法

    http://download.jikexueyuan.com/detail/id/432.html 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的 ...

  3. 《深入理解Java虚拟机》笔记01 -- 运行时数据区

    运行时数据区示意图 1. 程序计数器 占用一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.主要用来记录线程执行到哪条语句了,分支.循环.跳转.异常处理.线程恢复等功能都需要依赖这个 ...

  4. spring oauth2.0 实现原理

    官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html 翻译及修改补充:Alex Liao. 转载请注明来源:htt ...

  5. 同余方程 (codevs1200)

    题目描述××× 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式××× 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行 ...

  6. NetCore + Mysql + EF:No coercion operator is defined between types 'System.Int16' and 'System.Boolean',

    总结三种解决办法: 1.Mysql升级到7 2.Nuget安装Pomelo.EntityFrameworkCore.MySql 2.2.0替代MySql.Data.EntityFrameworkCor ...

  7. 怎么解决java.lang.NoClassDefFoundError错误

    http://blog.csdn.net/jamesjxin/article/details/46606307

  8. Codeforces 1105D(双层广搜)

    要点 题意:可以拐弯,即哈密顿距离 注意不可以直接一个一个搜,这过程中会把下一轮的标记上,导致同一轮的其它点没能正常完成应有的搜索 因此采用双层广搜,把同一轮先都出队列再的一起搜 #include & ...

  9. opencv作业

    作业下载地址: 链接:http://pan.baidu.com/s/1qYQnbkw 密码:v7y9

  10. .net程序员业余Android开发赚点外快(介绍一下自己的经验)

    记得是11年10月份开始研究android的,当时还不会java,听说android比较火,自己也买了个垃圾android机,平时工作也不是特别忙,于是我就突发奇想,想试试做一下android应用可不 ...