dojo Quick Start/dojo入门手册--面向对象,定义Class
2011-07-26 19:00
381 查看
下一步我们看看dojo里如何定义Class:
declare有三个参数: 第一个 class名字;第二个 父类的引用 ;第三个 ...
构造函数的名字就叫做"construnctor"
再来看看如何继承
使用this.inherited方法调用父类
关于构造函数
父类构造函数总是被自动调用的,所以看下面的例子:
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里的关键字参数。
多继承,mixin
说到继承,多继承的问题又来了。dojo支持多继承,准确地说,是mixin。还记得dojo.declare的第二个参数吗,就是表示父类的那个参数,这个参数可以是一个数组,数组的第一个元素作为声明的类的父类,其他的作为mixin。子类自动获得父类和mixin的所有方法,后面的mixin的同名方法覆盖前面的方法。
其他的比较有用的函数就是dojo.mixin和dojo.extend了,顾名思义,一个是作用于对象实例,一个是用于扩展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(); |
构造函数的名字就叫做"construnctor"
再来看看如何继承
dojo.declare("VIP",Customer,{ getDiscount:function(){ alert("Discount is 0.8"); } }); var vip = new VIP("Mark"); vip.say(); vip.getDiscount(); |
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 |
constructor:function(args){ var args = args || {}; this.name = args.name; this.age = args.age; } |
说到继承,多继承的问题又来了。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里如何定义和继承Class --dojo Quick Start/dojo入门手册5
- Ajax 对象 xmlhttp --dojo Quick Start/dojo入门手册2
- dojo Quick Start/dojo入门手册--package机制
- dojo Quick Start/dojo入门手册
- 开始使用dojo.js --dojo Quick Start/dojo入门手册1
- dojo Quick Start/dojo入门手册--开始使用dojo.js
- dojo Quick Start/dojo入门手册--xmlhttp dojo.xhrGet
- 获取json、xml的数据类型--dojo Quick Start/dojo入门手册3
- dojo Quick Start/dojo入门手册--json
- 类似于Function.bind的dojo.hitch --dojo Quick Start/dojo入门手册4
- dojo的package机制--dojo Quick Start/dojo入门手册6
- dojo Quick Start/dojo入门手册--dojo.hitch scope/context
- Java 基础入门随笔(7) JavaSE版——面向对象定义、特征:封装、构造函数
- Dojo Quick Start Guide 快速入门 基本框架
- Dojo QuickStart 快速入门教程 (1) Why Dojo
- scala入门教程:scala中的面向对象定义类,构造函数,继承
- Dojo QuickStart 快速入门教程 (4) 简单的测试框架
- Dojo QuickStart 快速入门教程 (2) 基本框架
- ExtJs4.0面向对象入门级别类的定义和对象的生成解析
- JavaScript从入门到放弃(3)-对象的不同创建方法-实现真正的面向对象