注:原文 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定義的方法,而且應該定義在構造函數外部。