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("男");