1、支持命名空间
定义:对于类的组织定义方式
代码举例:
Ext.namespace("Ext.dojochina");
和C#里面的命名空间差不多,在Java中类似于包的概念,
Java代码对照:
package Ext.dojochina;
看以下代码:
Ext.namespace("Ext.dojochina");
Ext.dojochina.HelloWorld = Ext.emptyFn;
上面代码定义了一个HelloWorld的空函数,等同于:
Ext.namespace("Ext.dojochina");
Ext.dojochina.HelloWorld = function(){};
可以用以下代码调用:
new Ext.dojochina.HelloWorld();
如果去年上面的命名空间声明行:Ext.namespace("Ext.dojochina"); 则会出错!
2、类实例属性
Ext.namespace("Ext.dojochina"); Ext.dojochina.Person = Ext.emptyFn; Ext.apply(Ext.dojochina.Person.prototype,{name:"name"});
上面的代码中,name就是Person的一个属性,Ext.apply是Ext提供的一个静态方法,主要作用是将后面一个参数赋到前面的参数对象上。
Java对照代码:
private String name = "name"; public String getName() { return name; } public void setName(String name) { this.name = name; }
可以用以下代码调用:
var _person = new Ext.dojochina.Person(); alert(_person.name); //这里还没有设值,因此弹出默认值name _person.name = "selfly"; alert(_person.name); //这里已经设过值了,弹出selfly
3、类实例方法
Ext代码:
print:function(){ alert(String.format("姓名:{0},性别{1},",this.name,this.sex)); }
Java对照代码:
public void print(){ System.out.println("姓名:%s,性别%s",this.name,this.sex); }
实例代码:
Ext.namespace("Ext.dojochina"); Ext.dojochina.Person = Ext.emptyFn; Ext.apply(Ext.dojochina.Person.prototype,{ name:"", sex:"", print:function(){ alert(String.format("姓名:{0},性别:{1}",this.name,this.sex)); } }); var _person = new Ext.dojochina.Person(); _person.name = "张三"; _person.sex = "男"; _person.print(); _person.name = "王五"; _person.sex = "女"; _person.print();
4、类静态方法
Ext.namespace("Ext.dojochina"); Ext.dojochina.Person = Ext.emptyFn; Ext.dojochina.Person.print = function(_name,_sex){ var _person = new Ext.dojochina.Person(); _person.name = _name; _person.sex = _sex; _person.print(); } Ext.apply(Ext.dojochina.Person.prototype,{ name:"", sex:"", print:function(){ alert(String.format("姓名:{0},性别:{1}",this.name,this.sex)); } }); Ext.dojochina.Person.print("张三","男"); Ext.dojochina.Person.print("王五","女");
5、构造方法
Ext.namespace("Ext.dojochina"); Ext.dojochina.Person = function(_cfg){ Ext.apply(this,_cfg); } Ext.dojochina.Person.print = function(_name,_sex){ var _person = new Ext.dojochina.Person({name:_name,sex:_sex}); _person.print(); } Ext.apply(Ext.dojochina.Person.prototype,{ print:function(){ alert(String.format("姓名:{0},性别:{1}",this.name,this.sex)); } }); Ext.dojochina.Person.print("张三","男"); Ext.dojochina.Person.print("王五","女");
6、支持类继承
Ext.namespace("Ext.dojochina"); Ext.dojochina.Person = function(_cfg){ Ext.apply(this,_cfg); } Ext.apply(Ext.dojochina.Person.prototype,{ job:"无", print:function(){ alert(String.format("姓名:{0},性别:{1},角色:{2}",this.name,this.sex,this.job)); } }); Ext.dojochina.Teacher = function(_cfg){ Ext.apply(this,_cfg); } Ext.extend(Ext.dojochina.Teacher,Ext.dojochina.Person,{job:"老师"}); //Teacher继承Person并给job重新赋值 Ext.dojochina.Student = function(_cfg){ Ext.apply(this,_cfg); } Ext.extend(Ext.dojochina.Student,Ext.dojochina.Person,{job:"学生"}); //Student继承Person并给job重新赋值 var _teacher = new Ext.dojochina.Teacher({name:"张三",sex:"男"}); _teacher.print(); var _student = new Ext.dojochina.Student({name:"王五",sex:"女"}); _student.print();
7、类实例方法重写
Ext.namespace("Ext.dojochina"); Ext.dojochina.Person = function(_cfg){ Ext.apply(this,_cfg); } Ext.apply(Ext.dojochina.Person.prototype,{ print:function(){ alert(String.format("姓名:{0},性别:{1}",this.name,this.sex)); } }); Ext.dojochina.Teacher = function(_cfg){ Ext.apply(this,_cfg); } Ext.extend(Ext.dojochina.Teacher,Ext.dojochina.Person,{ print:function(){ alert(String.format("{0}是一位{1}老师",this.name,this.sex)); } }); //Teacher继承Person并重写print方法 var _teacher = new Ext.dojochina.Teacher({name:"张三",sex:"男"}); _teacher.print();
8、支持命名空间别名、类别名
Ext.namespace("Ext.dojochina"); Dc = Ext.dojochina; Ext.dojochina.Person = function(_cfg){ Ext.apply(this,_cfg); } PN = Ext.dojochina.Person;
这里把命名空间Ext.dojochina取了一个别名Dc,对于命名空间别名的命名,最好以大写字母开头,
当然小写字母也没错,但这是一个良好的编码规范。
9、支持事件队列
Ext的事件队列模式,由Ext.util.Observable类支持。
Ext.namespace("Ext.dojochina"); Ext.dojochina.Person = function(){ this.addEvents( "namechange", "sexchange" ); } Ext.extend(Ext.dojochina.Person,Ext.util.Observable,{ name:"", sex:"", setName:function(_name){ if(this.name != _name){ this.fireEvent("namechange",this,this.name,_name); this.name = _name; } }, setSex:function(_sex){ if(this.sex != _sex){ this.fireEvent("sexchange",this,this.sex,_sex); this.sex = _sex; } } }); var _person = new Ext.dojochina.Person(); _person.on("namechange",function(_person,_old,_new){ alert("old name:"+_old+" new name:"+_new); }); _person.on("sexchange",function(_person,_old,_new){ alert("old sex:"+_old+" new sex:"+_new); }); _person.on("namechange",function(_person,_old,_new){ alert("old name2:"+_old+" new name2:"+_new); }); _person.setName("张三"); _person.setSex("男");