dojo Quick Start/dojo入门手册面向对象,定义Class

下一步我们看看dojo里如何定义Class:

dojo.declare("Customer",null,{
    constructor:function(name){
        this.name = name;
    },
    say:function(){
        alert("Hello " + this.name);
    },
    getDiscount:function(){
        alert("Discount is 1.0");
    }
});

var customer1 = new Customer("Mark");
customer1.say();

declare有三个参数: 第一个 class名字;第二个 父类的引用 ;第三个 ...

构造函数的名字就叫做"construnctor"


再来看看如何继承

dojo.declare("VIP",Customer,{
    getDiscount:function(){
        alert("Discount is 0.8");
    }
});
var vip = new VIP("Mark");
vip.say();
vip.getDiscount();

使用this.inherited方法调用父类

dojo.declare("VIP",Customer,{
    getDiscount:function(){
        this.inherited(arguments);
        //this.inherited("getDiscount",arguments);
    }
});

关于构造函数

父类构造函数总是被自动调用的,所以看下面的例子:

dojo.declare("Customer",null,{
    constructor:function(name){
        this.name = name;
        alert("base class");
    },
    say:function(){
        alert(this.name);
    }
});

dojo.declare("VIP",Customer,{
    constructor:function(age){
        this.age = age;
        alert("child class");
    },
    say:function(){
        alert("name:" + this.name);
        alert("age:" + this.age);
    }
});

var vip = new VIP("123");//1
vip.say();//2

1将打印出两条alert语句,先是父类的构造函数,再是子类的。 2将输出"name: 123" "age: 123" 。个人认为,这个特性并不好,因为javascript这种弱类型的语言中,根本无法确定构造函数中的参数是传递给谁的,就比如上面的语句执行后,name="123",age="123",那哪个才是正确的?这个问题在使用dojo Grid的model里就很麻烦,定义一个model得这样:new dojox.grid._data.Table(null,null,data);我要是想扩展这个Model,更麻烦,所有子类的构造函数都被父类给搞乱了。所以推荐的做法是使用关联数组作为构造函数的参数,就像Python里的关键字参数。

constructor:function(args){
    var args = args || {};
    this.name = args.name;
    this.age = args.age;
}

多继承,mixin

说到继承,多继承的问题又来了。dojo支持多继承,准确地说,是mixin。还记得dojo.declare的第二个参数吗,就是表示父类的那个参数,这个参数可以是一个数组,数组的第一个元素作为声明的类的父类,其他的作为mixin。子类自动获得父类和mixin的所有方法,后面的mixin的同名方法覆盖前面的方法。

dojo.declare("Customer",null,{
    say:function(){
        alert("Hello Customer");
    },
    getDiscount:function(){
        alert("Discount in Customer");
    }
});

dojo.declare("MixinClass",null,{
    say:function(){
        alert("Hello mixin");
    },
    foo:function(){
        alert("foo in MixinClass");
    }
});
dojo.declare("VIP",[Customer,MixinClass],{
});
var vip = new VIP();
vip.getDiscount();
vip.foo();
vip.say();//输出"Hello MixinClass"

其他的比较有用的函数就是dojo.mixin和dojo.extend了,顾名思义,一个是作用于对象实例,一个是用于扩展class,翻文档和源码吧。

原文地址:https://www.cnblogs.com/soundcode/p/2117561.html