下一步我们看看dojo里如何定义Class:
dojo.declare("Customer",null,{ var customer1 = new Customer("Mark"); |
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,{ dojo.declare("VIP",Customer,{ var vip = new VIP("123");//1 |
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,{ dojo.declare("MixinClass",null,{ |
其他的比较有用的函数就是dojo.mixin和dojo.extend了,顾名思义,一个是作用于对象实例,一个是用于扩展class,翻文档和源码吧。