javascript:物件導向編程基礎:封裝

來源:互聯網
上載者:User
“在物件導向的思想中,最核心的概念之一就是類。一個類表示了具有相似性質的一類事物的抽象,通過執行個體化一個類,可以獲得屬於該類的一個執行個體 (即對象)”。很長一段時間以來(這裡本人要幸災樂禍地說),js是“一種點綴的作用,完成很有限的功能,諸如表單驗證之類,其語言本身也一直被當作過程化的語言使用,很難完成複雜的功能。”。但是(這裡本人要苦大仇深、痛心疾首地說),“而Ajax的出現使得複雜指令碼成為必需的組成部分,這就對JavaScript 程式設計提出了新的要求,很多Ajax應用開始利用JavaScript物件導向的性質進行開發,使邏輯更加清晰。事實上,JavaScript 提供了完善的機制來實現物件導向的開發思想。”。額的神啊,本來就不想學不敢學的,現在不得不硬著頭皮學了。
這裡關於對象就廢話這麼多了。我們都知道物件導向編程的三個主要特點是:封裝、繼承和多態。下面就圍繞著這三個特點,記錄一些學習心得。
好的,先從封裝性開始介紹,眾所周知,對象是封裝的最基本單位。封裝防止了程式相互依賴性而帶來的變動影響。物件導向的封裝比傳統語言的封裝更為清晰、更為有力。Code is cheap.來看簡單的代碼:Code
//定義函數的方式定義類 
function class1() {
    //類成員的定義及建構函式 
    //這裡class1 既是一個函數也是一個類。作為函數,它可以理解為類的建構函式, 負責初始化的工作。
}

//使用new操作符獲得一個類的執行個體 
var obj=new class1(); 
/*拋開類的概念,從代碼的形式上來看,class1 就是一個函數,那麼是不是所有的函數都可以用new來操作呢?答案是肯定的。
在JavaScript 中,函數和類就是一個概念,當new 一個函數時,就會返回一個對象。如果這個函數中沒有初始化類成員,那就會返回一個空的對象。
事實上,當new一個函數時,這個函數就是所代表類的建構函式,其中的所有代碼都可以看作為了初始化一個對象而工作。用於表示類的函數也稱之為構造器。 
在JavaScript 中,每個對象可以看作是多個屬性(方法)的集合
*/

function test() {
    alert(typeof (obj));
}

上面的代碼定義了一個類class1,這就是js中簡單的封裝,下面我們看js如何定義“靜態類”,

Code
function class1() {//建構函式 
}
//靜態屬性 
class1.staticProperty = "test";
//靜態方法 
class1.staticMethod = function() {
    alert(class1.staticProperty);
}

function test() {
    //調用靜態方法
    class1.staticMethod();
    alert(typeof (class1));

}

接著看“抽象類別”:

Code
/*
在傳統物件導向語言中,抽象類別中的虛方法必須先被聲明,但可以在其他方法中被調用。 
而在JavaScript 中,虛方法就可以看 該類中沒有定義的方法,但已經通過this 指標使用了。 
和傳統物件導向不同的是,這裡虛方法不需經過聲明,而直接使用了。這些方法將在衍生類別 
中實現
*/

//定義extend 方法 
Object.extend = function(destination, source) {
    for (property in source) {
        destination[property] = source[property];
    }
    return destination;
}
Object.prototype.extend = function(object) {
    return Object.extend.apply(this, [this, object]);
}
//定義一個抽象基類base,無建構函式 
function base() { }
base.prototype = {
    initialize: function() {
        this.oninit(); //調用了一個虛方法 
    }
}
//定義class1 
function class1() {
    //建構函式 
}
//讓class1繼承於base 並實現其中的oninit方法 
class1.prototype = (new base()).extend({
    oninit: function() {   //實現抽象基類中的oninit 虛方法 
        //oninit 函數的實現 
    }
});

我們看到,上面“讓class1繼承於base 並實現其中的oninit方法時”,使用了“繼承”的概念,請留意。再來看一下執行的效果:

Code
function test() {
    var obj = new class1();
    obj.oninit = function() { alert("test"); }
    obj.oninit();
}

結語:前面我們已經簡單類比實現了普通類,“靜態類”,“抽象類別”,的定義(和C#相比),那麼介面呢,委託呢?js可以類比定義出來嗎?果然是學無止境。不善於借鑒和學習的程式員不是好程式員,推薦兩篇關於js介面和委託的文章,http://www.cnblogs.com/harrychen66/archive/2008/10/10/488457.html,http://www.cnblogs.com/harrychen66/archive/2006/08/19/481328.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.