在原生的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. centos7及以上安装git服务

    检查git是否安装或者是版本 whereis git等命令来检查是否已经安装了git版本的 git --version检测到我的环境自带的git版本 已安装但不是想要的版本需要卸载 yum remov ...

  2. 动画重定向技术分析和Unity中的应用

    http://www.jianshu.com/p/6e9ba1b9c99e 因为一些手游项目需要使用Unity引擎,但在动画部分需要使用重定向技术来实现动画复用,考虑到有些项目开发人员没有过这方面的经 ...

  3. Noip2016day1 玩具迷题toy

    题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉 ...

  4. python3的encode()和decode()

    python3的encode()和decode() 在python3的内存中. 在程序运行阶段. 使⽤用的是unicode编码. 因为unicode是万国码. 什么内容都可以进行显示. 那么在数据传输 ...

  5. GYM 101933K(二项式反演、排列组合)

    方法一 设\(f_i\)为最多使用\(i\)种颜色的涂色方案,\(g_i\)为恰好只使用\(i\)种颜色的涂色方案.可知此题答案为\(g_k\). 根据排列组合的知识不难得到\(f_k = \sum_ ...

  6. Linux上使用VIM进行.Net Core

    如何在Linux上使用VIM进行.Net Core开发 对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE.Windows上有Visual Studio, Mac上有Vi ...

  7. CS round--36

    https://csacademy.com/contest/round-36/summary/ C题是一个贪心,最坏情况是,一开始肯定是每一对袜子都抽一个,然后就需要N个袜子了.后面的情况就是相同的了 ...

  8. 朱晔的互联网架构实践心得S2E7:漫谈平台架构的工作(基础架构、基础服务、基础平台、基础中间件等等)

    前言 程序开发毕竟还不是搬砖这种无脑体力劳动,需要事先有标准,有架构,有设计,绝对不是新公司今天创立,明天就可以开始编码的.其实很多公司在起步的时候没有财力和资源建设独立的基础架构或平台架构部门,甚至 ...

  9. Exception sending context destroyed event to listener instance of class

    五月 29, 2019 6:29:39 下午 org.apache.catalina.core.StandardContext listenerStop严重: Exception sending co ...

  10. Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?

    最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例, 蛋疼的是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做. 然后我只能找谷歌了,翻 ...