dojo类机制简介

Dojo 1.8:向完美架构继续前行 Dojo 1.8已正式发布数星期,作为Dojo的铁杆粉却直到今天才来总结,实在心有不安,但这并不妨碍我们来看一看那些让人眼前一亮的新特性。作为历史最悠久的RIA框架,Dojo的发展一直不冷不热。比起后来者JQuery的大红大紫,Dojo则默默的按照自己的步伐坚定的前行着。而对完美架构的追求,则构成了Dojo前行的主旋律,这也使得Dojo一直拥有一批坚定的支持者。Dojo显然并不重视设计灵巧的API 阅读详情

随着AJAX和RIA技术的发展,JavaScript被广泛的使用,并在开发中发挥着越来越重要的作用。JavaScript提供了特有的类机制,但是在语法习惯上与传统面向对象的语言有很大的不同,这使得不少的JavaScript开发人员感到比较迷惑,而dojo作为功能强大的JavaScript类库,有功能完整的类机制实现。本文将通过实例介绍dojo的类机制,这是dojo提供的一种强大和灵活的功能,其dijit UI组件框架也是以此为基础实现的。

1.    使用dojo定义类

声明dojo类是通过dojo.declare()方法来实现的,如我们想要定义一个名为com.levinzhang.Person的类,该类有name、age属性和getName、getAge方法:

dojo.declare("com.levinzhang.Person", null,{
     name:null,
     age:null,
     constructor: function(name,age){
          this.name = name;
          this.age = age;
},
getName:function(){
          return this.name;
},
    getAge:function(){
          return this.age;
   }
});

除了前面提到的属性的和方法以外,在代码中我们还定义了一个名为constructor的方法,这个方法在dojo的类机制中至关重要,当我们实例化该类得到对象的时候,该方法将会被调用,从而完成初始化的操作。


dojo的declare接受三个参数,分别为类的名称、要继承的父类以及该类的属性和方法。实例化类的语法也很简洁,与实例化普通的JavaScript类并无分别:

var person  = new com.levinzhang.Person("levinzhang",30);
alert(person.getName());//将会提示出levinzhang

 

2.               实现静态变量

在常见的面向对象语言中,经常会使用到类层次的静态变量,而通过dojo定义的类也能实现静态变量的需求,不过静态变量仅限于数组和对象类型。

staticInfo:{count:0},
constructor: function(name,age){
          this.name = name;
          this.age = age;
          ++this.staticInfo.count;
   }

如上所示,如果定义了数组和对象,而没有在构造方法中进行修改的话,这个对象将会成为该类的静态属性,测试代码如下:

var person  = new com.levinzhang.Person("levinzhang",30);
alert(person.staticInfo.count);//此时将会提示出1
 
var person2  = new com.levinzhang.Person("levin",30);
alert(person2.staticInfo.count);//此时将会提示出2

         需要注意的两点是:1)对于原始类型的变量如数字、布尔值和字符串,dojo的类机制并没有提供实现静态属性的功能;2)如果定义的数组或对象属性在constructor方法中被重新赋值,那么该属性将不再是静态属性,而是每个实例化对象都持有一份属于自己的备份了。


3.    使用dojo实现继承

在JavaScript中没有直接实现继承的关键字,因此关于继承有多种的实现方式,代表性的是类式继承和原型式继承,但是不管哪种继承方式都需要开发人员对JavaScript语言本身有着很深厚的了解。dojo对JavaScript的继承机制进行了很好的封装,可以实现功能强大的类定义,我们将对一些常见的功能进行介绍。

dojo.declare方法中的第二个参数,是指明要继承的父类的,该参数可以为null(要定义的类没有父类)、单个类(要定义的类继承自一个父类)或数组(要定义的类继承自多个父类)。

1)               单继承

我们要定义一个名为com.levinzhang.Employee的类,继承自com.levinzhang.Person,并要添加名为workExperience的属性、重写getName方法等功能:

dojo.declare("com.levinzhang.Employee", com.levinzhang.Person,{
  workExperience:null,
       constructor: function(name,age,workExperience){
             this.workExperience = workExperience;
        },
  getWorkExperience:function(){
             return this.workExperience;
        },
  getName:function(){
            return "Employee:"+this.name;
  },
  getInput:function(){
             return 5000;
  }
});

在以上的代码中,我们定义的com.levinzhang.Employee继承了com.levinzhang.Person并添加了自定义的方法。测试代码如下:

var employee = new com.levinzhang.Employee("levin",30,4);
alert(employee.getName());//将提示出Employee:levin
alert(employee.getWorkExperience());//将提示出4
alert(employee.getAge());//将提示出30

可以看到在Employee的实例中,我们能够调用父类中定义的方法。而在类的constructor初始化方法中,我们并没有调用父类相关的方法,但是我们成功初始化了name和age两个属性,这是因为dojo会自动调用父类的初始化方法,完成继承要求的相关初始化工作。


2) 多继承

dojo支持多继承的功能, dojo实现了被Python和很多支持多继承语言使用的C3算法。使用dojo的多继承功能时,需要注意的是:只有数组中的第一个元素会作为真正的父类,而其它的元素则是通过mixin的方式进行属性添加以构建原型链的。

如我们需要定义一个类来表示公司中的股票持有者(com.levinzhang.Shareholder),而公司中的员工可能也会持有股票,于是我们定义一个名为com.levinzhang.ShareholderEmployee的类继承自com.levinzhang.Shareholder和com.levinzhang.Employee。

dojo.declare("com.levinzhang.Shareholder", com.levinzhang.Person,{
   share:null,
   constructor: function(args){
          this.share = args.share;
   },
   getShare:function(){
          return this.share;
   }
});
 
dojo.declare("com.levinzhang.ShareholderEmployee", [com.levinzhang.Employee,com.levinzhang.Shareholder],{
    getInfo:function(){
          alert("I'm an Employee with stock.My share is "+this.getShare()+"."+"My name is "+this.getName()+".");
   }
});

在以上的代码中,我们调整了原有的初始化传入参数的格式,由传入多个参数改为传入一个简单JavaScript字面量对象的方式(原有的代码也要稍作调整),并通过多继承的方式实现了一个类用来描述持有股票的员工。测试代码如下:

var shareholderEmployee =  new com.levinzhang.ShareholderEmployee({name:"levin",age:30,workExperience:4,share:300});
   shareholderEmployee.getInfo();
//将会提示出“I'm an Employee with stock.My share is 300. My name is Employee:levin.”

关于dojo多继承的更多话题,请参考dojo的文档资料。


3) 调用父类的方法

在编程中,我们经常会遇到在子类的某个方法中需要调用父类的方法来协作完成功能。如我们定义名为com.levinzhang.Manager的类,该类继承自com.levinzhang.Employee类,并重写getInput方法,Manager的收入分为两部分,一部分是与com.levinzhang.Employee相同的固定收入,另一部分是与管理经验相关的其它收入,这样在定义Manager的时候,就需要调用父类的方法,实现方式如下:

 

dojo.declare("com.levinzhang.Manager", com.levinzhang.Employee,{
   manageExperience:null,
   constructor: function(args){
          this.manageExperience = args.manageExperience;
   },
   getInput:function(){
          var fromBase = this.inherited(arguments);
          return fromBase+1000*this.manageExperience;
   }
});


从以上代码可以看到,通过inherited方法的使用,使得Manager可以调用父类的方法。测试代码如下:

var manager = new com.levinzhang.Manager({name:"levin",age:30,workExperience:4,manageExperience:2});
alert(manager.getInput());//7000

在以上的测试代码中,getInput的返回值为7000,说明该值为子类和父类方法共同确定的。


除了使用inherited来调用父类中的方法以外,从dojo的1.4版本开始提供了链式调用父类方法的功能,能够通过设置自动调用父类的方法,并且支持类似于AOP的before或after配置(dojo正在开发中的1.7版本,提供了更为丰富的AOP功能,我们将会持续关注)。

4.    Dojo类机制的其它功能

除了以上介绍的类定义相关功能以外,dojo还提供了许多的便利的工具类供使用。

dojo类所生成对象具有一些特有的属性和方法,常见的如isInstanceOf方法和declaredClass属性,isInstanceOf方法判定对象是否为某个类的实例,而declaredClass属性则能够表明该对象的声明类是什么。如:

var manager = new com.levinzhang.Manager({name:"levin",age:30,workExperience:4,manageExperience:2});
alert(manager.isInstanceOf(com.levinzhang.Employee));//提示为true
alert(manager.isInstanceOf(com.levinzhang.Person));//提示为true
alert(manager.declaredClass);//提示为“com.levinzhang.Manager”

            类机制还涉及到的包管理等功能,限于篇幅,不再展开叙述,感兴趣的读者可以参考dojo的在线文档或图书。


5.               小结

JavaScript本身的类机制比较复杂,对开发人员有着较高的要求,而dojo提供了功能强大的类功能,有些降低了开发的难度。本文简单介绍了dojo类机制的基本功能,包括类定义、继承、静态属性等,这是dojo最基础也是最核心的内容之一,dojo的许多高级功能都是基于此来实现的,因此了解这部分功能的使用方式甚至源码实现对于整体把握dojo框架都大有裨益。

 

 

 

参考资料:

《JavaScript权威指南》 DavidFlanagan著张铭泽译

http://docs.dojocampus.org/

http://blog.youkuaiyun.com/dojotoolkit/

http://dojotoolkit.org/

 

作者信息:张卫滨,关注企业级Java开发和RIA技术,个人博客:http://lengyun3566.iteye.com,微博:http://weibo.com/zhangweibin1981

 

 

声明: 
  本文已经首发于InfoQ中文站,版权所有,原文为《dojo类机制简介》,如需转载,请务必附带本声明,谢谢。 
  InfoQ中文站是一个面向中高端技术人员的在线独立社区,为Java、.NET、Ruby、SOA、敏捷、架构等领域提供及时而有深度的资讯、高端技术大会如QCon 、线下技术交流活动QClub、免费迷你书下载如《架构师》等。 

dojo常用方法总结 dojo常用方法总结,主要是元素的获取,事件的监听,数组的遍历等 立即下载

相关推荐

dojo精品中文教程(全)

分三个包上传时,第三个包好像传不上去,我给整合了一下,打在一个包里上传了! dojo精品中文教程 Dojo.1.0 Practice Note [1] 什么是dojo 选择dojo的理由 AJAX架构之Dojo篇 Adding Ajax中文版 (DoJo) DOJO学习笔记(七)-日期控件DropdownDatePicker和DatePicker DOJO常用的验证函数 Dojo with Adobe AIR Dojo 工具包教程 Dojo 快速安装 Dojo和JSON建立无限级AJAX动态加载的功能模块树 Dojo学习笔记( 模块与包) Dojo学习笔记-- djConfig解说 Dojo学习笔记-- dojo.dom Dojo学习笔记-- dojo.event & dojo.event.topic & dojo.event.browser Dojo学习笔记--DateTextbox Dojo学习笔记--Dojo的基础对象和方法 Dojo学习笔记--FisheyeList鱼眼效果 Dojo学习笔记--TabContainer Dojo学习笔记--ValidationTextbox Dojo学习笔记--dijit.Dialog Dojo学习笔记--dijit.Menu Dojo学习笔记--dijit.TitlePane Dojo学习笔记--dijit.Tooltip Dojo学习笔记--dijit.Tree Dojo学习笔记--dojo.graphics.color & dojo.uri.Uri Dojo学习笔记--dojo.string & dojo.lang Dojo学习笔记--动态生成widget Dojo学习笔记--开发自己的TitlePane Dojo学习笔记--页面部分区域遮挡,DialogUnderlay Dojo学习笔记(五)-djConfig详解 dojo data 接口详解 dojo0.9 使用心得 dojo学习笔记(一)-dojo.io.IO & dojo.io.BrowserIO) dojo学习笔记(三) dojo学习笔记(二) dojo.lang.array & dojo.lang.func & dojo.string.extras dojo学习笔记(六)- ContentPane dojo学习笔记(四) dojo的拖拽示例以及疑问! 介绍dojo事件 使用 Dojo 工具包和 JSON-RPC 构建企业 SOA Ajax 客户端 利用Dojo实现拖动(Drag and Drop)效果

Dojo语法精讲

Dojo语法精讲黄诚 整理QQ群:65643887第一句话分号;;(function(){这是出现在dojo.js文件中的第一句话。它是来在每条语句结尾使用,表示语句结束的符号,其实有时候可能省略分号,解释器通常能正确识别JavaScript语句并执行。在ECMASc

gong0585的专栏 1570

Dojo.js核心dojo的javaScript类库Dojo.js核心dojo的javaScript类库Dojo.js核心dojo的javaScript类库

dojo.js.核心jsDojo.js核心dojo的javaScript类库Dojo.js核心dojo的javaScript类库Dojo.js核心dojo的javaScript类库Dojo.js核心dojo的javaScript类库

【Dojo学习之四】Dojo语法

Dojo的语法,哎,就不解释了,说一下我学习时候遇到的问题的地方 1.关于dojo多方法链接的问题,dojo的强大之处,因为javascript是单线程语言,所以dojo通过自己的方法连接了多个方法 多方法连接 var mineObj = { aMethod: function(){ console.log('running A'

365Marathon 1988

KUKA 虚拟调试实战——打通Simpro4.1与OfficeLite8.6的通信与实时控制链路

本文详细介绍了KUKA虚拟调试实战,重点解析如何打通Simpro4.1与OfficeLite8.6的通信与实时控制链路。通过环境搭建、权限配置、机器人型号匹配等关键步骤,帮助工程师高效完成机器人轨迹规划和PLC联锁逻辑验证,大幅降低真机调试风险。文章还提供了典型报错解决方案和实时控制优化技巧,适用于工业机器人仿真与培训场景。

weixin_30907935的博客 448

eMMC数据擦除的方式

接下来主要是讲解erase、trim、discard的差异,涉及的command有CMD35、CMD36、CMD38。一般用来擦除整卡或者某些分区,如果只想擦除一个。以下是device status的部分解释。eMMC的数据擦除方式有6种,分别是。将会跳过写保护,只执行其他的范围。Discard的命令序列是。Erase的命令序列是。的范围有包含写保护,Trim的命令序列是。

DPJimmy的博客 1772

Dojo学习笔记

hello world入门 dojo.addOnLoad(function() { dojo.create( "div", { "innerHTML": "Hello, Huangbaokang!" }, dojo.body() ); }); 可以使用cdn等方式引入,或者本地引入,远程域名引...

huangbaokang的博客 583

c++界面开发入门

c++界面开发 DialogBox MessageBox

jiaodou2的博客 6517

dojo类机制实现原理分析

前段时间曾经在InfoQ中文站上发表文章,介绍了dojo类机制的基本用法。有些朋友在读后希望能够更深入了解这部分的内容,本文将会介绍dojo类机制幕后的知识,其中会涉及到dojo类机制的实现原理并对一些关键方法进行源码分析,当然在此之前希望您能够对JavaScript和dojo的使用有些基本的了解。dojo的类机制支持类声明、继承、调用父类方法等功能。dojo在底层实现上是通过操作原型链来实现其类

Dojo中文博客 7686

分布式数据采集框架openclaw-worker:模块化设计与实战指南

数据采集是获取网络信息、实现自动化处理的基础技术,其核心原理是通过模拟HTTP请求从目标源提取结构化数据。在工程实践中,传统单体脚本面临维护困难、扩展性差等挑战。分布式采集架构通过解耦任务定义与执行,结合消息队列实现水平扩展,显著提升了系统的弹性与可靠性。openclaw-worker作为模块化的工作节点,将采集流程配置化,支持CSS选择器、XPath等多种提取规则,并集成请求速率控制、代理IP池等反爬策略,适用于竞品监控、内容聚合等需要高效、稳定获取数据的应用场景。

weixin_28706423的博客 299

GPOPSII 对控制量变化率进行约束,避免控制量振荡

在这篇文章中,在GPOPSII中通过对控制量变化的约束,优化求解得到更平滑的控制量曲线,更符合真实控制约束。

Dannyfomer的博客 1871

dojo事件机制详解(一)

概述 dojo中的事件实现并不复杂,当然我只是从代码量的角度出发,但含金量还是很高的,而且很容易实现自定义事件监听,还支持发布订阅模式,下面我们从源代码级别来看看 dojo中的事件机制是如何实现的,深入了解后,甚至可以将其拷贝出来直接就能在其它使用。 事件机制使用中主要涉及以下4个函数: 1. dojo.connect(); 建立事件监听连接 2. dojo.disconnect();

云原生之家 3223

2025小红书爬虫还能活?破解x-s签名+动态Cookie,亲测爬1000条笔记零封禁(附逆向全过程)

上周帮美妆行业的朋友爬小红书“口红推荐”笔记,刚发30个请求就被403,抓包一看x-s签名不对;换Cookie继续爬,爬50条又被封——小红书的反爬这两年简直是“地狱模式”:动态Cookie每10分钟过期,x-s签名算法季度更新,连请求头的User-Agent顺序错了都会被拦。。这篇文章不藏私,把逆向x-s签名的全过程、动态Cookie的维护技巧、1000条稳定爬取的实战代码全给你,连我踩过的8个坑都标出来了(最后附代理池配置,IP零封禁的关键)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 7406

Dojo面向对象机制深入剖析

Dojo是一个强大的基于javascript语言的web控件库,他提供了一种基于javascript的面向对象开发编码模式,使得善于于运用面向对象思维coding的我们在写比较复杂的前端web2.0应用的时候,也可以避开javascript语言的不足,写出漂亮的面向对象风格的前端代码,dojo的这个特性使得web工程师们开发web2.0应用显得更加得心应手,尤其是开发大型的web2.0应用,可以极大的提高代码的可读性和可维护性。本文主要和大家探讨一下dojo的这种面向对象的机制。

Dojo中文博客 6976

安川机器人外部轴添加

本文详细介绍了如何在安川机器人本体上添加第7轴以及如何设置动作,本文以添加点焊枪为例进行讲解。

haier123888的博客 7892

LSTM 深度解析从原理推演到现代序列建模的演进

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊的递归神经网络(RNN),它通过引入记忆单元(Cell State)来解决普通RNN在长序列数据处理中的梯度消失问题。LSTM可以在长时间的序列中捕捉依赖关系,是一种非常适合处理时间序列、自然语言处理、语音识别等任务的深度学习模型。在LSTM中,记忆单元(Cell State)是一个贯穿整个序列的数据通道,用于存储和传递关键信息。记忆单元在LSTM的时间步之间保持信息的持久性,可以看作是一个长期记忆的“容器”。

hello.reader 3万+

dojo框架简介

一.dojo介绍 dojo是一个js的工具集,一个面向对象的js框架(在widget中更能体现这点),根据功能分成多个module,每个module又分为多个package,可以根据程式的需要导入不同的package,类似于JAVA。  官方网站: http://dojotoolkit.org/  操作指南: http://manual.dojotoolkit.org/WikiHome 

sinat_32349327的博客 2979

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

理解dojo.require机制

Dojo 提供了一个非常强大的javascript控件库. 在使用dojo之前,用户基本上不需要具备任何基础知识. 你可以用script远程链接到dojo(dojo.js), 也可以把dojo.js下载到本地并用script标签加载.如果你不太了解dojo, 可以参考一下如下资料:Dojo 1.4 Cheat SheetDojo Base Source Tree (1.4.3)Dojo Reference Guide大体上,dojo.js和jquery.js 或者 prototype js, 里面有很

Dojo中文博客 3万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

Dojo中文博客 8366

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Dojo

dojo的类机制支持类声明、继承、调用父类方法等功能。dojo在底层实现上是通过操作原型链来实现其类机制的,而在实现继承时采用类式继承的方式。值得一提的是,dojo的类机制允许进行多重继承(注意,只有父类列表中的第一个作为真正的父类,其它的都是将其属性以mixin的方法加入到子类的原型链中),为解决多重继承时类方法的顺序问题,dojo用JavaScript实现了Python和其它多继承语...

dianxuanfan4560的博客 337

dojo的事件机制

使用 Dojo 处理 DOM 事件当 Dojo 运行在支持 DOM Level2 事件模型的浏览器中时,Dojo 只是把事件处理委托给浏览器来完成。而在与 DOM Level2 的事件模型不兼容的浏览器(比如 IE)中,Dojo 会尽量使用浏览器的 API 模拟 DOM Level2 中的事件处理函数。 Dojo 最终提供给开发者一个称为“简单连接”的事件处理机制来处理 DOM 事件。为什

jove420的专栏 1199

一句话解释 dojo.publish 和 dojo.subscribe

这俩个函数都与事件紧密相关. -- dojo.subscribe(/*String*/ topic, /*Object|null*/ context, /*String|Function*/ method) 订阅一个主题 -- dojo.publish(/*String*/ topic, /*Array*/ args) 发布一个主题 先抛开这两个函数, 现在有一个函数 fu

Patrick's 专栏 8270
上一篇: Dojo 1.7正式Release
下一篇: dojo类机制实现原理分析
dojotoolkit
博客等级 码龄16年 1205粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值