天天看點

JavaScript 面向對象程式設計之一

一:Class and private And public

JS 中的類以 function 進行聲明,同時 JS 也支援聲明私有 private 和公有 public 成員,隻不過跟 C# 不一樣,它們不是使用這兩個關鍵字實作的。具體如何實作,直接看代碼:

function SampleClass(arg1) {

    /* 聲明了一個私有方法 */ 

    function priMethod1() { 

        alert("private method 1"); 

    }

    /* 聲明了一個私有變量,并指派 */ 

    var x1 = 3;

    var x2 = arg1;

    /* 聲明了一個私有變量,并立刻執行 priMethod1,将傳回值指派給該變量 */ 

    var y = priMethod1();

    /* 聲明了一個私有變量,并定義了一個方法,并将該方法的引用指派給該變量 

       備注:是以,不會執行,到 z(); 時候才會執行; 

     */ 

    var z = function() { 

        alert("private method 2"); 

    };

    /* 聲明了一個共有變量,并定義了一個方法,并将該方法的引用指派給該變量 

    this.PubMethod1 = function () { 

        alert("public method 1"); 

    /* 以下為 公共成員 ,注解同上*/ 

    this.A = 2; 

    this.B = this.PubMethod1();

    this.C = function() { 

        alert("public method 2"); 

    }; 

}

上面的代碼中我們可以了解 SampleClass 同時也聲明了一個帶一個參數的構造器,構造器參數本身左右 SampleClass 的一個私有變量存在;

二:new SampleClass(2) 發生了什麼事情?

如果用 OO 的思想來了解,

var testClass = new SampleClass(2);

首先成了一個對象,并執行構造方法。在上面的代碼中,注釋中,已經注明了哪些是聲明,哪些是在聲明的同時執行了方法。

也就是說,如果 new SampleClass(2),從 UI 的角度來說,我們會看到彈出兩條消息:

"private method 1" 和 "public method 1"。

在 testClass 上,我們也體會到 私有成員 和 公有成員 的差別,如果我們在 Visual Studio 中編碼,通過 testClass 隻能智能感覺到公有成員。

三:JS 中屬性?

JS 中沒有屬性這一說,以

舉例,我們調用在:

testClass.B;

的時候,實際上根本不會去執行 PubMethod1 這個方法,PubMethod1 這個方法實際上是在構造器中已經被執行過了。是以,我們要通過 testClass 去執行代碼,隻能通過為 SampleClass 定義方法的方式來完成。

四:this 關鍵字以及如何在類内部擷取到目前對象

在 SampleClass 中,我們通過 this 關鍵字來創造公有成員,即意味着,通過 this 在類型内部擷取到了目前對象。那麼,是否在 SampleClass 内部使用 this 擷取到的永遠是目前對象内?顯然不是的。假設在 SampleClass 内部,有如下一段代碼:

this.SomeData = [];

this.TestMethod1 = function() {

    $.ajax({ 

        type: "GET", 

        success: function(data) { 

            this.SomeData = data;             

        } 

    }); 

};

實際上,在 success 回調方法内部,對于 this.SomeData 的指派是不會成功的。如果我們通過調試器,檢視此處的 this,它代表是回調方法的引用所代表的那個對象本身,如下:

JavaScript 面向對象程式設計之一

那麼,我們就是要在方法内部得到目前對象怎麼辦,方法是在 SampleClass 内部聲明一個私有成員,然後:

var parentThis = this;

然後,在你需要用到目前對象的時候,使用 parentThis 就可以了。

本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/p/3342172.html,如需轉載請自行聯系原作者

繼續閱讀