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 #ff0000"
// "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


本文转自Flyingis博客园博客,原文链接:http://www.cnblogs.com/flyingis/archive/2008/04/15/1153566.html,如需转载请自行联系原作者

相关文章
|
JavaScript 前端开发 Java
【JavaScript面向对象详解】
【JavaScript面向对象详解】
135 0
|
存储 安全 JavaScript
【JavaScript】25_面向对象——封装
# 6、封装 面向对象的特点: 封装、继承和多态 1.封装 - 对象就是一个用来存储不同属性的容器 - 对象不仅存储属性,还要负责数据的安全 - 直接添加到对象中的属性,并不安全,因为它们可以被任意的修改 - 如何确保数据的安全: 1.私有化数据 - 将需要保护的数据设置为私有,只能在类内部使用 2.提供setter和getter方法来开放对数据的操作 - 属性设置私有,通过getter setter方法操作属性带来的好处 1. 可以控制属性的读写权限 2. 可以在方法中对属性的值进行验证 - 封装主要用来保证数据的安全 - 实现封装的方式
60 0
|
存储 设计模式 JavaScript
理解JavaScript中的“面向对象”
面向对象,是程序开发者再熟悉不过的一个概念。一说到它,你首先会想到的是什么?类?继承?方法与属性?不同技术栈的开发者或许有不同的第一反应。面向对象本身只是一种编程方式,支持面向对象的语言很多,但其实现原理却并不都一样。大多数语言的面向对象特性都是基于“类”来实现的,例如C++,Objective-C,Java,Python等。在这些语言中,类是面向对象的基础,面向对象的继承,多态,封装也是通过类来实现的。
128 0
|
JavaScript 前端开发
JavaScript面向对象详解(三)
继承是面向对象中非常重要的特性. ES5中和类的实现一样, 不能直接实现继承. 实现继承主要是依靠原型链来实现的。
101 0
JavaScript面向对象详解(三)
|
设计模式 JavaScript 前端开发
JavaScript面向对象详解(一)
ES6之前的JavaScript面向对象比较不好理解,涉及到很多知识和思想。 ES6增加了class和extends来实现类的封装和继承,但是通过babel转换成ES5之后还是之前的一套逻辑。 这里,我打算用四篇文章,来讲解一下关于ES5中面向对象的知识体系,一起学习一下吧!
76 0
|
JSON JavaScript 前端开发
JavaScript面向对象详解(四)
在上一篇中, 我们讨论了ES5中, 实现继承的一些方式. 在最后, 我们说了组合继承是相对完美的解决方案, 但是它也存在一些问题. 这篇文章, 我们就通过某种新的模式, 给出一种目前使用最多, 也是我们最终的解决方案.
104 0
|
存储 JSON 移动开发
JavaScript面向对象(四)
JavaScript面向对象(四)
146 0
JavaScript面向对象(四)
|
JavaScript 前端开发 Java
JavaScript面向对象
JavaScript 面向对象
116 0
|
JavaScript 前端开发 Java
|
JSON JavaScript 前端开发
JavaScript基础(六)面向对象
面向对象 对象创建方式: 1、调用系统函数创建对象 (创建对象的最简单方式就是创建一个 Object 的实例,然后再为它添加属性和方法。) var obj = new Object(); obj.name = "Daotin"; obj.age = 18; obj.eat = function () {   console.log("我很能吃"); ); 缺点:使用同一个接口创建很多对象,会产生大量的重复代码。
1182 0