關於javascript類的編寫與繼承的一些心得

昨天不註意看到一個題,據說是一個公司的面試題,上面就說到瞭用javascript來編寫一個類並實現一些方法,而且通過這個類來派生出一些派生類,來實現另外的一些方法!這個時候,有些朋友也不會,所以呢,我也在網上找瞭一下相關的資料說明,看能不能找到這些關於javascript的類的編寫的說明文檔,找是找到瞭,不過很多都沒有進行詳細的說明講解,所以呢,就有瞭今天的這篇blog瞭哈!這裡僅是一些粗略的講解,有不到之處呢請多多見諒哈!高手略過!好,下面開講解吧!

  1、類的構造

  在這裡我以人類為一個簡單的例子來構造呢,首先是聲明,就像平臺寫方法一樣哦,如下:

  function Human(){}這是方法一,

  var Human = function(){}這是方法二,兩種都是可以的,我們就用第一種聲明方法呢:完整代碼如下:

function Human(name, age, sex) {

        ///<summary>

        ///這裡為一個人類的簡單類

        ///</summay>

        ///<param name="name">人的名稱</param>

        ///<param name="age">人的年齡</param>

        ///<param name="sex">人的性別</param>

        //region 該類的屬性成員

        this.name = name;

        this.age = age;

        this.sex = sex;

        //endregion

 

        //region 該類的一個方法

        //這個為定義在內部的方法

        this.ShowMsg2 = function () {

                ///<summary>

                ///顯示一個消息,這裡為彈出一個對話框,顯示年齡

                ///</summary>

                alert(this.age);

        }

        //endregion

}

 

  這樣就完成瞭一個類的構造瞭哈,下面我們還可能通過prototype來為這個類增加一些其他的方法,這樣可以在不改變這個類的內部結構的同時,改變這個類,如下:

Human.prototype.ShowMsg = function () {

        ///<summary>

        ///這個為定義在外部的通過prototype來定義的類的方法,顯示人的年齡,名稱,性別的信息

        ///</summary>

        alert("名稱:" + this.name + ",年齡:" + this.age.toString() + ",性別:" + this.sex);

}

  

  這樣就完成瞭一個外部方法的添加瞭哦!這樣也可以說是一個完整類就這樣完成瞭哈,朋友們也可以在內部直接聲明完成就可以瞭,不必在外面進行修改瞭,隻是通過這個方式的好處就是,可以不改變類的原型的基礎上進行類的修改,在不同的地方加上不同的方法也是可以的!

  2、類的繼承

  大傢都知道,寫瞭一個類,就會有用到派生的一些類瞭,所以這裡類的繼承也是必不可少的哦,派生類的聲明和基類的聲明其實並沒有什麼不同,略有不同之處就是在派生類的內部,調用瞭基類的構造方法,來實現類的繼承!如下

function Man(name, age) {

        ///<summary>

        ///這裡為一個男人的簡單類,繼承Human這個類

        ///</summay>

        ///<param name="name">人的名稱</param>

        ///<param name="age">人的年齡</param>

        ///<param name="sex">人的性別</param>        

        

        //這裡我們調用基類的構造函數,來實現類的繼承

        Human.call(this, name, age, "Boy");

        //這裡為重寫基類的內部方法.也可以更改基類通過prototype來定義的外部方法

        this.ShowMsg = function () {

                alert(this.name);

        }

}

  

  大傢可以看到這裡也有一個ShowMsg的方法,這個方法是重寫瞭基類的ShowMsg方法哦,不管基類的方法是通過內部定義的還是外部定義的,這裡都可以將其重寫,而通過外部prototype來進行重寫的話就隻能重寫基類通過prototype來聲明的方法瞭,比如基類中有一個ShowMsg2的方法,我想要修改它,而我通過prototype來進行修改,如下:

//最後發現這裡這一句話是可要可不要的哦

Man.prototype = new Human();

 

//這裡為重寫基類的外部方法,但是這裡並不能更改基類的內部方法

//如基類內部有一個方法叫ShowMsg2,但是這裡這個重寫方法並不能

//讓基類的這個方法生效,

Man.prototype.ShowMsg2 = function () {

        alert(this.age.toString() + this.name + this.sex);

}

  

  這裡並不能將基類的ShowMsg2重寫的,所以這種重寫是錯誤的,隻能通過派生類的內部進行聲明重寫才能成功!

  但是基類有一個外部聲明的方法叫ShowMsg對不,在這裡我們是可以通過派生類的prototype來進行重寫的,如下:

//這裡為重寫基類的外部方法ShowMsg,這裡是可以重寫的,但是請註意,因為在Man的類內部

//已經聲明瞭一個ShowMsg方法,所以這裡的重寫ShowMsg是無效的,在調用方法的時候,他不

//會執行這裡的這個ShowMsg方法,但是會執行派生類內部聲明的ShowMsg方法,這就是派生類

//繼承基類,並修改基類方法的方式瞭

Man.prototype.ShowMsg = function () {

        alert(this.name + this.age.toString() + this.sex);

}

 

  但是朋友們要註意瞭,如果我們在派生類裡面對這個ShowMsg這個方法進行瞭聲明的話,那麼這裡的這個重寫方法也是不會有任何作用的!要特別註意!

  OK!到這裡也就基本完成瞭簡單的說明!有不到之處請多多見諒!

 

本文出自 “Laputaliya” 博客

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *