`
xml
  • 浏览: 8244 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Dojo 之 面向对象

阅读更多
    面向对象三大特性:封装、继承、多态。在熟悉了Java/C#/C++这些高级面向对象语言的语法结构后,我们或多或少会对javascript脚本语言的面向对象感到一些不适,function、prototype、call、apply……

    如果真不了解javascript或这几个关键字,先看几篇简文:

1.JavaScript 基本组成
2.ECMAScript 基础
3.JavaScript 中的对象
4.JavaScript 中的继承

    为了消除这种对javascript面向对象语法的不适,众多js库都构建了更符合传统OO编程思想的代码框架,如prototype、mootools等等,引用mootools文档中创建对象的例子
var Animal = new Class({
    initialize: function(age){
    this.age = age;
    }
}); 
var Cat = Animal.extend({
    initialize: function(name, age){
    this.parent(age);     //将调用Animal的initialize方法;
    this.name = name;
    }
});
var myCat = new Cat('Micia', 20);
alert(myCat.name);     //显示 'Micia'
alert(myCat.age);     //显示 20


    Dojo作为一个强大的javascript工具箱,有它自己面向对象的开发方式,用declare解决了对象的创建和继承的问题,文档中的例子:
dojo.declare("my.classes.bar", my.classes.foo, {
    // properties to be added to the class prototype
    someValue: 2,
    // initialization function
    constructor: function(){
        this.myComplicatedObject = new ReallyComplicatedObject();
    },
    // other functions
    someMethod: function(){
        doStuff();
    }
);


    declare的第一个参数是对象名称,最后一个参数指定在这个对象里要添加的内容,包括函数和属性,写个例子
dojo.declare("Apple", null, {
        price: 5,
        constructor: function(weight) {
            this.total = weight * this.price;
        },
        print: function() {
            alert("The total price is " + this.total);
        }
    }
);
var myapple = new Apple(10);
myapple.print();    //输出结果:"The total price is 50"


    上例通过declare创建了一个Apple对象,javascript本身没有类的概念,可以使用对象本身来创建新的对象myapple,通过构造函数的参数值计算苹果的总价,print函数输出结果,非常形象的构建了一个Apple“类”,非常容易理解。要注意的是,这里如果声明默认构造函数, "new Apple(10)"将直接执行默认构造函数,带参数的构造函数就被忽略了,并非C++中顺序执行。

    注意dojo.declare第二个参数,如果创建一个独立的新对象,可以设为null,当需要从其他一个或多个对象继承时,则为对象名称,这样就方便的实现了对象继承。多个对象继承,declare第二个参数为一数组,第一个元素为原型父对象,其他的为mixin对象,通过代码来理解。
<script>
    dojo.declare("Apple", null, {
        price : 5,
        constructor : function(weight) {
            this.total = weight * this.price;
        },
//            constructor : function() {
//                alert("Create Apple !");
//            },
        print : function() {
            alert("The total price is " + this.total);
        }
    });
    dojo.declare("AppleTree", null, {
        constructor : function() {
            alert("Create AppleTree !");
        },
        print : function() {
            alert("This is an apple tree");
        },
        additional : function() {
            alert("This is a mixin class");
        }
    });
    
    dojo.declare("GreenApple", [Apple, AppleTree], {
        constructor : function() {
            alert("Getting a green apple");
        }
    });
</script>


    创建一个GreenApple对象,测试alert执行顺序!mixin对象的方法将覆盖之前对象中的同名函数,除非子对象也声明了同名函数print。
//输出
//"The height of the tree is undefined"
//"Getting a green apple"
var gapple = new GreenApple();
//输出,覆盖了Apple对象的print
//"This is an apple tree"
gapple.print();
//"This is a mixin class"
gapple.additional();


    dojo/_base/_loader/bootstrap.js有专门的mixin函数,用于对象的拷贝,将一个创建好的对象拷贝到新的对象中
var copy = dojo.mixin({}, new Apple(2));
copy.print();


    print输出结果是"The total price is 10",mixin参数一定是创建好的对象实例,否则出错!dojo.extend则可以将一个或多个对象的属性、方法拷贝到一个原型上,通过prototype实现继承,这是继承的另外一种方式。

    通过declare、mixin、extend,dojo给我们提供了一种方便的对象创建与扩展机制,一般情况下够用了,感觉还是比较方便,使用时也存在一些限制,翻翻源代码就能理解。这里主要是要知道dojo是如何面向对象的,方便我们更好的理解dojo基础功能,及dijit和dojox,dojo最为强大还是它的widgets。本文涉及的js源码:
mixin:dojo/_base/_loader/bootstrap.js
extend:dojo/_base/lang.js
declare:dojo/_base/declare.js
分享到:
评论
6 楼 鹤惊昆仑 2008-08-28  
静态成员变量这个问题确实很恼人
5 楼 web20 2008-04-18  
在dojo的面向对象的声明中,很重要也是和Java的class声明很不一样的一点是你不能将Array和Object声明在类的成员变量里,否则这些Array和Object将成为这个类的静态成员变量。需要在class的constructor中对这些变量进行初始化才可以。
dojo.declare("my.classes.bar", my.classes.foo, {
        someData: [1, 2, 3, 4], // doesn't do what I want: ends up being static
        numItem : 5, // one per bar
        strItem : "string", // one per bar
         constructor: function() {
                this.someData = [ ]; // better, each bar has it's own array
                this.expensiveResource = new expensiveResource(); // one per bar
        }
});


Arrays and Objects as Member Variables
4 楼 xml 2008-04-18  
shatuo 写道

  现在在进行基于dojo 1.0.0版本的封装,基本上dijit内的和dojox的Tree、Grid都替换成自己实现的,样式吗,是模仿Ext的样式。1.1的Grid功能有了些提升,不过不能令人满意。dojotoolkit.org上的roadMap还是0.9-1.0,最近好像看到过一次到2.0的roadmap,2.0比起1.1跟令人期待。


看来EXT现在确实很热!样式都按照它的来做,快成为实事标准了

有机会把你自定义的Tree、Grid贴上来瞧瞧吧
3 楼 shatuo 2008-04-16  
xml 写道
shatuo 写道
dojo的core(dojo)不错,不过dijit中的很多组件有问题,也没有精心打造样式,很多时候需要自己打造widget(dojo的扩展机制很适合自己动手)。


看过大家对dojo widget的一些讨论,褒少贬多,不过都是针对过去0.x版的,最新1.1的评论还没有看到,希望1.1能够有所改进!看到dojo这么丰富的组件库,除了它的易用性外,还关心它的性能,javaeye对dojo讨论不多,大家都在用EXT了


  现在在进行基于dojo 1.0.0版本的封装,基本上dijit内的和dojox的Tree、Grid都替换成自己实现的,样式吗,是模仿Ext的样式。1.1的Grid功能有了些提升,不过不能令人满意。dojotoolkit.org上的roadMap还是0.9-1.0,最近好像看到过一次到2.0的roadmap,2.0比起1.1跟令人期待。
2 楼 xml 2008-04-16  
shatuo 写道
dojo的core(dojo)不错,不过dijit中的很多组件有问题,也没有精心打造样式,很多时候需要自己打造widget(dojo的扩展机制很适合自己动手)。


看过大家对dojo widget的一些讨论,褒少贬多,不过都是针对过去0.x版的,最新1.1的评论还没有看到,希望1.1能够有所改进!看到dojo这么丰富的组件库,除了它的易用性外,还关心它的性能,javaeye对dojo讨论不多,大家都在用EXT了
1 楼 shatuo 2008-04-16  
dojo的core(dojo)不错,不过dijit中的很多组件有问题,也没有精心打造样式,很多时候需要自己打造widget(dojo的扩展机制很适合自己动手)。

相关推荐

    精通Dojo by Dojo之父

    Dojo是一个非常强大的、面向对象的、开源的JavaScript工具箱,它为开发富客户端Ajax应用提供了一套完整的小部件和一些特效操作。曾经有人这样说:“对于一个Web开发者而言,如果没有Dojo,他将是一个“残废”的...

    dojo dojo实例 dojo例子 dojo资料 dojo项目 dojo实战 dojo模块 dojo编程

    7. **dojo/aspect**:提供面向切面编程(AOP)的支持,允许在方法调用前、后或替代方法执行插入额外的功能。 8. **dojo/data**:提供了一种数据模型接口,用于与各种数据源进行交互,比如从服务器获取数据。 9. **...

    DOJO 学习笔记 dojo

    Dojo 是一个功能丰富的 JavaScript 库,它提供了一系列模块化、面向对象的工具,用于构建高性能的 Web 应用程序。在 Dojo 中,模块和包的概念是核心组成部分,它们帮助开发者组织和管理代码,使其更易于维护和重用。...

    Dojo 入门 + Dojo 工具包系列 + Dojo 使用技巧 ......

    随着RIA的兴起,Dojo成为了JavaScript开发者的首选之一,尤其是对于那些有Java背景的开发者,它提供了一种结构化的、面向对象的方式来处理Web前端的复杂性。 Dojo的核心是一个模块化的体系架构,允许开发者按需加载...

    精通Dojo 中文版PDF版(高清)

    Doio是一个功能强大的面向对象开源JavaScript工具包,它为开发新一代Web程序提供了一套完整的小部件和一些特效,得到了IBM、Sun、Zend等公司的大力支持。 本书是Dojo之父Alex Russell与人编著的一部Dojo权威之作,...

    dojo官网的源码dojo官网的源码

    3. **对象和类**:Dojo提供了一套面向对象的编程模型,包括`dojo/_base/lang`中的函数增强、对象创建和继承。`dojo/_base/declare`用于创建类,支持多重继承。 4. **DOM操作**:`dojo/dom`和`dojo/query`模块提供了...

    dojo控件的使用和入门心得

    - **面向对象编程**:Dojo的编写风格鼓励面向对象,使代码更加模块化和易于维护,类似于Java或.NET的类结构。 #### 关键概念解析 - **RIA(Rich Interface Applications,富界面应用)**:指具备桌面应用程序特性...

    DOJO权威指南+DOJO1.1源码

    - **dojo/_base**: 包含了DOJO的基础功能,如事件处理、对象继承、数组操作等。 - **dojo/dom**: 提供DOM操作的API,包括查找、操作和监听DOM元素。 - **dojo/domReady**: 一个确保DOM完全加载后的回调函数,常...

    dojo 离线API

    Dojo Toolkit 包含了许多模块,如`dojo/_base`系列,它们提供了基础的JavaScript功能,如事件处理、对象创建等。`dojo/dom`和`dojo/dom-geometry`用于DOM操作和元素几何信息获取,而`dojo/on`则用于事件监听。此外,...

    图书:Dojo入门

    此外,Dojo Toolkit提供了`dojo.declare`用于类的定义,支持面向对象编程。 Dojo中的Widget系统是另一个重要部分,它包含了大量的UI组件,如按钮、表单元素、日历等,方便开发者构建富客户端应用。这些组件基于dojo...

    dojo学习...........

    Dojo 框架是一个全面的JavaScript工具集,专注于提供面向对象的编程能力,尤其适用于构建复杂且高性能的Web应用程序。在深入学习Dojo之前,了解JavaScript的基础知识,尤其是面向对象编程的概念,是非常重要的,因为...

    dojo学习笔记

    Dojo 提供了面向对象编程的支持,`dojo/declare` 可以创建类,而`dojo/_base/lang` 提供了面向对象的一些辅助函数,如`lang.mixin`用于混合对象属性。 4. **Dijit UI组件** Dijit库提供了一系列可复用的UI组件,...

    dojo事件处理框架

    Dojo事件处理框架是JavaScript库Dojo Toolkit中的一个重要组成部分,它提供了一种统一的方式来管理和处理DOM事件以及JavaScript对象之间的交互。这个系统深受面向切面编程(AOP)思想的影响,尤其是其advice机制,...

    Dojo相应的jar包

    8. **dojo/aspect**: 用于面向切面编程(AOP),可以方便地插入或拦截方法调用。 9. **dijit**: Dojo的UI组件库,包含了大量的可复用的、响应式的用户界面控件,如按钮、表单、布局容器等。 10. **dojox**: 扩展库...

    dojo1.8.3官方demo

    1. **dojo/_base**: 这是Dojo的基础模块,包含许多核心功能,如事件处理、类系统、对象扩展、异步操作等。 2. **dojo/dom**: 提供DOM(Document Object Model)操作,包括获取、设置DOM节点属性,创建和移除元素等...

    dojo-release-1.10.0

    `dojo/aspect`实现了面向切面编程,用于拦截和修改对象方法的调用,是实现AOP的关键。 11. **dojo/i18n** 国际化支持 Dojo 提供了`dojo/i18n`模块,帮助开发者实现多语言支持,轻松切换不同地区的语言资源。 ...

    dojo权威入门教程

    《dojo权威入门教程》是一本专注于JavaScript库Dojo Toolkit的学习指南,主要面向Java开发者或对Web前端技术感兴趣的人员。Dojo Toolkit是一个强大的JavaScript框架,它提供了丰富的组件、工具和API,帮助开发者高效...

    dojo开发文档

    `dojo/aspect`则用于面向切面编程,提供环绕、前置、后置通知等AOP功能。 5. **dojo/store和dojo/data**:这两者是Dojo的数据存储抽象层,`dojo/store`适用于现代Web应用,而`dojo/data`则用于较早的Dojo版本。它们...

    dojo 一个小的例子

    3. **数据绑定**:Dojo 提供了`dojo/Stateful` 和 `dojo/_base/declare` 模块,支持面向对象编程和数据绑定。通过声明式绑定,我们可以轻松实现视图与模型的同步。 4. **AJAX通信**:`dojo/xhr` 模块提供了与服务器...

Global site tag (gtag.js) - Google Analytics