JS學習筆記-OO疑問之封裝

來源:互聯網
上載者:User

標籤:c   style   class   blog   code   java   

         封裝是物件導向的基礎,今天所要學習的匿名函數與閉包就是為了實現JS的物件導向封裝。封裝實現、封裝變數,提高資料、系統安全性,封裝正是物件導向的基礎。


匿名函數

        即沒有名字的函數,其建立方式為

                 function(){...}

        單獨存在的匿名函數,無法運行,可通過賦值給變數調用或通過運算式自我執行來實現運行。

                  1.賦值給變數為一般的函數使用方式

                          var run = function(){

                                   return ‘方法運行中‘;

                          };

                          alert(run());

                  2.通過運算式自我執行

                          (function(arguments可選)

                          {

                                   alert(‘方法運行中‘);

                           })(arguments);

閉包

        在一個普通函數的內部,建立一個匿名函數,匿名函數可訪問普通函數中的變數,進而實作類別似於物件導向中封裝的特性,這個匿名函數就叫做對應普通函數的閉包。閉包就是對外建立的介面,通過介面達到訪問函數內部變數的效果。

        functionrun() {

                 varusername = ‘Forrest‘;

                 return function () { //通過匿名函數返回 box()局部變數

                          returnusername;

                 };

        }

         //alert(username);                  //錯誤username is not defined

        alert(run()());

       特點:閉包中使用的局部變數會駐留在記憶體中,避免了使用全域變數造成的命名衝突等情況的發生。值得注意的是閉包中使用this關鍵字,指向的是window對象。

 

封裝

        為了更好的安全性、資料保護,則需要對資料進行私人化的封裝,而JS中沒有塊級範圍的概念(即出了{}的範圍,仍可以訪問聲明的變數),但有了前面的基礎,我們就可以達到像其他正規物件導向語言的封裝效果。

         function user(){             (function(){                 for(i = 0; i<5; i++){                     alert(i);                 }             })();             alert(i);                          //此處無法訪問變數i         }         //私人範圍代替全域變數         (function(){             var username= 'Forrest';             alert(username);        })();                                  //匿名函數執行完畢後,變數立即銷毀         //訪問私人變數         function User(){             var username= Forrest;            //私人變數     function learn(){                 //私人函數                 return '學習中';             };             //對外提供介面,間接訪問內部成員             this.userlearn = function(){                 return username + learn();             };         }           var user = new User()         alert(user.userlearn());         //實現get()、set()         function User(value){             var user = value;             this.getUser = function(){                 return user;             }             this.setUser = function(value){                 user = value;             }         }         var user = new User('Forrest');         alert(user.getUser());         user.setUser('Li');         alert(user.getUser());         //靜態私人變數         (function(){             var user = '';             User = function(value){                 user = value;             };             Box.prototype.getUser = function(){                 return user;             };             Box.prototype.setUser = function(value){                 user = valu;             };         })();                  //字面量方式的私人化         function NormalUser(){}         var user = function(){             var user = 'Forrest';             function learn(){                 return user + '學習中...';             };             var nu = new NormalUser();             nu.userlearn = function(){                 return learn();             };             return nu;         }();         alert(user.userlearn());

         

中結:

         JS雖不是一門正統的物件導向的語言,但用它也能達到物件導向的封裝、繼承、多態等的效果,學習起來還是需要好好理解的,特別是對於使用JS不是特別多的人來說,只能等到以後的逐步應用來解決這一系列的問題,更進一步體會它在物件導向方面的應用。

聯繫我們

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