深入理解javascript中實現物件導向編程方法

來源:互聯網
上載者:User

標籤:

介紹Javascript中物件導向編程思想之前,需要對以下幾個概念有瞭解:

1. 淺拷貝和深拷貝:程式在運行過程中使用的變數有在棧上的變數和在堆上的變數,在對象或者變數的賦值操作過程中,大多數情況先是複製棧上的資訊,這樣就會出現以下情況,如果變數是對象,那麼這一操作,複製的只是真正對象所在 的堆記憶體空間的起始地址,這就是所謂的淺拷貝,如果是深拷貝,則是在記憶體堆空間中重新分配一個記憶體,並把分配的記憶體的起始地址複製過去。

2. 參考型別資料和實值型別資料:談到參考型別資料和實值型別資料,自然而然的聯想到記憶體的堆和棧,參考型別的資料真正的內容是存放在記憶體的堆上的(記憶體的釋放是通過人工的釋放或運行時的記憶體回收機制實現的), 而實值型別的資料是存放在記憶體的棧上面的(函數執行完之後,會通過彈出棧的方式釋放記憶體)。實際上大多數的程式設計語言中賦值操作都是copy記憶體棧上的內容,但是這一簡單的操作對實值型別和參考型別之間產生的效果是 有很大不同的,對於實值型別的資料而言,這一操作就實作類別把真正的值賦值給另外一個變數,對於參考型別的資料而言,這操作只是簡單的將真正值的地址資訊賦值給另外一個變數,其實際的內容資訊是存放在堆上空間 上的。【Javascript中的實值型別有:數值,布爾類型,null和undefined等;參考型別有:數組,對象和函數等】

3. Javascript中對象的原型鏈:Javascript中的所有對象都具有prototype這一屬性,而這一屬性的本身也是一個對象(同樣,它也有prototype屬性),如此一層一層向上迴圈就形成了一個原型鏈,知道這個原型鏈到達 Object這一級,而Object的prototype屬性為null,此時,原型鏈就終止了。通過原型鏈,可以給Javascript中的對象(與其說是對象,不如說是類)添加屬性,通過這種方法添加的屬性,將會在後期new的所用執行個體都具用這 些屬性。如果添加的屬性是實值型別話,後期執行個體化對象的時候,這些屬性會在每個執行個體化的對象中有各自的複製版本,但是如果通過prototype添加的屬性是參考型別的話,在後期的執行個體化的所有對象都共用同一個版本,因 此,通過一個對象操作這一個屬性,會同時影響到所有的執行個體對象。所以,我們應該盡量的不要使用這種方法添加一些"變數"類型的屬性,而是盡量的使用該方法添加一些"方法"類型的屬性。

你可以嘗試通過以下demo程式加深對這一概念的理解:

var innermodel=function(){    this.msge="Init message";}innermodel.prototype.msge="";innermodel.prototype.changeMsg=function(newmsge){        this.msge=newmsge;};var instance=new innermodel();function testmodel(inparams){    this.arrtest=inparams;}testmodel.prototype.innermod=instance;testmodel.prototype.show=function(){    //this.arrtest[0]=6;    alert(this.innermod.msge);}testmodel.prototype.arrtest=[];var testArr=new testmodel([1,2,3,4]);var testArr2=new testmodel([4,5,6,7]);testArr.show();testArr.innermod.changeMsg("new mssage");testArr2.show();
View Code

4. Javascript 中對象的constructor屬性: Javascript中對象的constructor屬性是prototype對象的一個屬性,constructor屬性通常是用來判斷一個對象的類型,在Javascript物件導向編程中繼承時候經常使用到。

5. javascript中對象方法(類方法)和原型方法之間的區別:對象方法是通過對象名稱直接調用,相當於其他物件導向程式設計語言中的靜態方法,原型方法是通過每個對象(類)執行個體化一個instance是調用的,也就是說每個對象執行個體化一個instance都會 有自己的複製版本(注意這裡的複製,只是淺複製,複製的只是方法的地址,而真正的方法體在記憶體中只有一份)。

6. Javascript中原型鏈的訪問流程,使用執行個體化的對象訪問屬性或方法時候,如果引用的方法或者屬性不屬於該對象的方法或屬性,則會向上尋找該方法或屬性是否屬於其原型鏈上某個對象的方法或者屬性,知道找到匹配的 或者到達原型鏈的頂端(即prototype為null,Object的prototype就是null),Javascript面向編程中經常使用該方法來實現繼承。

深入理解javascript中實現物件導向編程方法

聯繫我們

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