Javascript - ExtJs - 類

來源:互聯網
上載者:User

標籤:建議   vbox   原型繼承   har   stop   方法   hello   hid   封裝   

類(Class)

preparation!

我用的是ext-4.2,解壓後會得到以下檔案

學習要用到的檔案很少,現在保留以下檔案和整個檔案夾,然後刪除其它檔案並保持目錄結構。本頁面底部有提供基礎包的下載。

在aspx頁面中引入必要的Extjs檔案,ext-all-dev可以不引人,但它作為調試使用,so建議保留。

測試一下程式是否能跑起來。

<script type="text/javascript">    Ext.onReady(function () {        Ext.MessageBox.alert("title","hello");    });</script>
View Code

類

自訂類型

ExtJs允許你基於它提供的方法建立自訂的類型,建立自訂類型使用Ext的define方法。 所有使用define方法註冊的類,其執行個體的屬性、方法都是從原型上獲得而非從建構函式獲得。構造器只用於初始化配置資訊,將屬性、方法綁定到執行個體上。 

Ext.define(x,y)

x是自訂類,y是匿名對象用於設定類成員。

<script type="text/javascript">    //參數1是命名空間.類名    //參數2是類的成員,成員全部放在匿名對象中,    //匿名對象一般設定兩個屬性,    //一個屬性是config,表示配置資訊,它用於儲存物件的屬性和方法    //一個屬性是constructor,表示類的建構函式    //要使config的屬性、方法成為類執行個體的屬性、方法就需要使用initConfig初始化它們    Ext.onReady(function () {        Ext.define("Yin.Person", {            config: {                name: "預設",                age: 20,                say: function () { Ext.MessageBox.alert("",this.name+this.age); },            },            constructor: function (config) {                this.initConfig(config);            }        });        //new對象時會調用constructor構造器初始化config配置資訊        var person = new Yin.Person({            name: "寒食",            age:32        });        person.say();//寒食32        alert(Yin.Person.prototype.hasOwnProperty("say"));//true say方法屬於Person類的原型對象的方法        alert(Yin.Person.prototype.hasOwnProperty("name"));//true name屬性屬於Person類的原型對象的屬性        alert(Yin.Person.prototype.hasOwnProperty("age"));//true age屬性屬於Person類的原型對象的屬性    });    </script>
View Code

initConfig從哪裡來的?解析器會在該對象上去尋找initConfig方法,如果找不到就會去原型鏈上尋找,所以initConfig可以確定是來自類的原型對象,通過調用原型的initConfig方法,該方法內部會將config進行遍曆,接著逐一取出每個屬性,然後賦給原型對象自己。所以類的執行個體對象正是通過原型繼承的原理得到了這些成員。另外,如果我們在new對象時,沒有設定config,那麼在構造器中,this.initConfig(config);又是如何初始化name、age和say的呢?原因很簡單,config屬性和constructor屬性處於同一個塊(範圍)裡,所以,如果你執行個體化Person類時沒有顯示指定config,那麼構造器中的config就來自與它處於同一範圍的config屬性。 

get和set訪問器 

使用Ext的define方法建立的類會獲得Ext原型對象上定義的get、set訪問器,專用於擷取(get)和設定(set)對象的屬性或方法,注意一旦通過set訪問器修改了屬性或方法的代碼邏輯,那麼被修改過的屬性或方法就會自動變成當前對象的原產生員(這是經本人測試後的理解,不保證正確)。

person.getName();//返回寒食person.getAge();//返回32person.getSay();//返回say方法person.setName("sam");//修改值person.setAge(50);//修改值person.setSay(function () {//修改方法    Ext.MessageBox.alert("", "我叫:"+this.name +"年齡:"+ this.age);});
View Code

類繼承

extend:z

z是父類

類繼承同樣可以使用Ext的define方法來完成,只需要在參數二(匿名函數)中指示extend屬性,它表示當前類將從extend指向的類處派生。 我們假設X要從Y派生,X的extend就應該指向Y,X如何獲得Y的成員?Y.prototype會將自身的成員copy給X.prototype,就這麼簡單。

<script type="text/javascript">    Ext.onReady(function () {        //建立Person類        Ext.define("Yin.Person", {            config: {                name: "預設",                age: 20,                say: function () { Ext.MessageBox.alert("",this.name+this.age); },            },            constructor: function (config) {                this.initConfig(config);            }        });                      //建立Man類        Ext.define("Yin.Man", {            extend: "Yin.Person",//指示派生自Yin.Person類            contructor: function () {                this.initConfig();            }        });        var man = new Yin.Man();        man.say();//繼承了Person的say方法    });    </script>
View Code

對象繼承

對象繼承使用Ext.apply方法,與類繼承類似,X對象要從Y對象繼承實際上是直接將Y對象的成員完全copy給X,如果X已經有與Y同名的成員,則會發生新覆蓋舊。如果不想覆蓋,可使用Ext.applyIf。

var obj = { gender: "男" };var obj2 = { name: "sam" }Ext.apply(obj2, obj);alert(obj2.gender);
View Code

類多重繼承

mixins:[x1,x2]

x是類名

Ext為瞭解決類只能派生自一個類,而不能從多個類派生的問題,使用了混入mixins,實際上就是將多個類的prototype的成員copy給需要多重繼承的類。

Ext.onReady(function () {    Ext.define("Yin.Person", {        config:{name:"寒食"},        constructor: function (config) { this.initConfig(config);}    });    Ext.define("Yin.Employee", {        config: { job: "設計" },        constructor: function (config) { this.initConfig(config);}    });    Ext.define("Yin.Husband", {        config: { age: "32" },        constructor: function (config) { this.initConfig(config); }    });    Ext.define("Yin.Man", {        extend: Yin.Person,        mixins: ["Yin.Employee", "Yin.Husband"]    });    var man = new Yin.Man();    var name=man.name;//寒食    var age=man.age;//32});
View Code

靜態成員

statics:{ }

如果要為類定義靜態成員可使用statics。 

Ext.define("Yin.Person", {    statics:{        ancestor:"monkey"    },    config:{name:"寒食"},    constructor: function (config) { this.initConfig(config);}});Yin.Person.ancestor//monkey
View Code

ExtJs組件類

學習ExtJs主要就是學習配置、組合各種組件,所以對於利用物件導向的思維去建立自訂類這種形式肯定顯得不太有那個必要。

Ext.Component類

ExtJs中的所有可視化組件全都派生自Ext.Component,該類有一些最基本的屬性用於控制呈現在html上的組件的樣式,比如我們要渲染一個灰色的盒子到html頁面,可如下設定:

<div id="divBox"></div><script type="text/javascript">    Ext.onReady(function () {        var box = new Ext.Component({            el: "divBox",            style: "background-color:#1E1E1E;margin:200px auto;",            width:100,            height:40        });        box.render();    });</script>
View Code

Ext.Container類

派生自Ext.Component類,它提供兩個及其重要的參數:layout和items。

Container的屬性

layout : border | 

指示組件如何在html上布局。

items : [ obj , obj ]

指示當前組件的所有子組件,子組件以{ }的形式出現。

items的屬性

xtype : 組件的字元表示

指示子組件是哪種類型,取值是首字母小寫組件名字。以前你可能指示items時會直接new出子組件,現在只需要指示xtype即可,比如要在當前組件中建立一個Panel組件: 

//以前的寫法items: [    new Ext.Panel({title:"主題",region:‘north‘}),    new Ext.Panel({ title: "菜單", region: ‘west‘,width:100} )]//如今的寫法items: [    { xtype: ‘panel‘, region: ‘north‘ ,title:"主題" },    { xtype: ‘panel‘, region: ‘west‘, title:"菜單",width: 100 }]
View Code

Ext.Util.observable類

只有繼承了Ext.Util.observable的組件會擁有事件,作為程式員幾乎只需要處理滑鼠鍵盤表單文檔載入等事件,所以此處略過。

Ext.EventObjectImpl類

Javascript的Event事件對象被ExtJs封裝為Ext.EventObjectImpl,該類整合了自訂事件、瀏覽器事件和Dom文檔事件,所以擁有事件的組件、ExtJs對象、Dom對象都會繼承EventObjectImpl,我們可以在事件發生時通過組件繼承EventObjectImpl所得到的屬性和方法去執行一系列的操作。

Ext.EventObjectImpl的方法

getX( ) | getY( )  | getXY( )

擷取事件發生時,觸發事件的對象在文檔中的x、y座標。最後一個方法返回數組,getXY( )[0]得到x座標,getXY( )[1]得到y座標。

getTarget( )

擷取觸發事件的來源物件。

preventDefault( bool )

是否阻止瀏覽器預設動作。

stopPropagation( bool )

是否阻止事件冒泡。似乎Jquery和ExtJs都不支援事件圍捕。

stopEvent( )

立即停止事件。該方法內部自動調用preventDefault()和stopPropagation()兩個函數,取消瀏覽器的預設操作,同時停止事件冒泡。 

purgeElement( )

清除該對象上鎖綁定的所有事件。

on | un

綁定事件監聽(偵聽)器、取消事件監聽(偵聽)器。 

<input id="test" type="text" /><script type="text/javascript">    Ext.onReady(function () {        //e就是觸發事件的對象,此處e表示鍵盤,e是Ext.EventObjectImpl的執行個體        Ext.get("test").on("keypress", function (e) {            if (e.charCode == e.SPACE) {                Ext.MessageBox.alert("","你按下了空格鍵位");            }        });    });</script>
View Code

 

ExtJs4.2基礎包↓

Javascript - 學習總目錄

Javascript - ExtJs - 類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.