javascript之定義函數時 this 和prototype區別


注:原文 http://www.2cto.com/kf/201406/307790.html

這里作為學習,寫在這里

 

在面向對象的方式編寫js腳本時,定義實例的方法主要有兩種:this.XXX = function()P{ 和 function.prototype.XXX= function(){}

function ListCommon2(afirst)
    {
      var first=afirst;
      this.do1=function ()
       {     
         alert("first do"+first);
       }               
       
    }   
     ListCommon2.prototype.do2=function()
    {     
         //  alert("first do"+first);//會出錯,不能訪問first
           this.do1();  // 通過調用 都do1()方法,間接的來訪問 first屬性。
    }

  this.do1=function ()和ListCommon2.prototype.do2=function()有什么區別呢?

都相當於類的實例方法,只有new后才能使用,那有什么區別呢?

測試代碼:

var t2=new ListCommon2("燒水2");
                t2.do1();//
                t2.do2();//

  經過測試發現:this.do1可以訪問構造函數內部的變量first,而ListCommon2.prototype.do2不能訪問,但能訪問函數this.do1。

如果把ListCommon2.prototype.do2定義在構造函數內部,也就可訪問了

function ListCommon2(afirst)
    {
      var first=afirst;
      this.do1=function ()
       {     
         alert("first do"+first);
       }     
       ListCommon2.prototype.do2=function() { alert("first do"+first);//定義在內部,就可以訪問 first // this.do1(); }       
       //實際上,講ListCommon2.prototype.do2寫在內部,是沒有意義的,直接 這樣寫 this.do2 = ..就可以了,向上面的do1一樣。
    //故 function.prototype.do2 = function(){....},一般寫在“類”的外部,用來實現向 類 語言(如php)的繼承特性,封裝特性。do2()方法相當於類內部的方法(類體內的方法,類內部的方法),do1()相當於定義在類體外(子類,對象)的方法。 } //測試代碼 var t2=new ListCommon2("燒水2"); t2.do1();// t2.do2();//

  

但作為實例函數,如果定義在構造函數內部,每次實例化都要執行,顯然在浪費內存,也不合理。

有些資料上把this.do1這類方法叫做特權方法,主要是為了訪問內部的私有字段,這樣就可以控制對某些字段的訪問。例如如上,就定義了一個私有字段first,只能通過構造函數傳遞,然后就不能修改了。

ListCommon2.prototype.do2這類方法相當於類的實例方法,但能訪問這些特權方法,間接訪問私有字段。

 結論:

如果要直接訪問私有字段,應該使用特權方法,也就是this定義的方法,應該定義在構造函數內部。相反,如果不需要直接訪問私有字段,應該使用prototype定義的方法,而且應該定義在構造函數外部。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM