AJAX中JavaScript類的三種成員

來源:互聯網
上載者:User
ajax|javascript    實作類別的公有成員

  前面定義的任何類成員都屬於公有成員的範疇,該類的任何執行個體都對外公開這些屬性和方法。

  實作類別的私人成員

  私人成員即在類的內部實現中可以共用的成員,不對外公開。JavaScript中並沒有特殊的機制來定義私人成員,但可以用一些技巧來實現這個功能。

  這個技巧主要是通過變數的範圍性質來實現的,在JavaScript中,一個函數內部定義的變數稱為局部變數,該變數不能夠被此函數外的程式所訪問,卻可以被函數內部定義的嵌套函數所訪問。在實現私人成員的過程中,正是利用了這一性質。

  前面提到,在類的建構函式中可以為類新增成員,通過這種方式定義的類成員,實際上共用了在建構函式內部定義的局部變數,這些變數就可以看作類的私人成員,例如:

<script language="JavaScript" type="text/javascript">
<!--
function class1(){
 var pp=" this is a private property"; //私人屬性成員pp
 function pm(){ //私人方法成員pm,顯示pp的值
  alert(pp);
 }
 this.method1=function(){
  //在公有成員中改變私人屬性的值
  pp="pp has been changed";
 }
 this.method2=function(){
  pm(); //在公有成員中調用私人方法
 }
}
var obj1=new class1();
obj1.method1();  //調用公有方法method1
obj1.method2();  //調用公有方法method2
//-->
</script>
  這樣,就實現了私人屬性pp和私人方法pm。運行完class1以後,儘管看上去pp和pm這些局部變數應該隨即消失,但實際上因為class1是通過new來啟動並執行,它所屬的對象還沒消失,所以仍然可以通過公開成員來對它們進行操作。

  注意:這些局部變數(私人成員),被所有在建構函式中定義的公有方法所共用,而且僅被在建構函式中定義的公有方法所共用。這意味著,在prototype中定義的類成員將不能訪問在構造體中定義的局部變數(私人成員)。

  要使用私人成員,是以犧牲代碼可讀性為代價的。而且這種實現更多的是一種JavaScript技巧,因為它並不是語言本身具有的機制。但這種利用變數範圍性質的技巧,卻是值得借鑒的。

  實現靜態成員

  靜態成員屬於一個類的成員,它可以通過“類名.靜態成員名”的方式訪問。在JavaScript中,可以給一個函數對象直接新增成員來實現靜態成員,因為函數也是一個對象,所以對象的相關操作,對函數同樣適用。例如:

function class1(){//建構函式
}
//靜態屬性
class1.staticProperty="sample";
//靜態方法
class1.staticMethod=function(){
 alert(class1.staticProperty);
}
//調用靜態方法
class1.staticMethod();
  通過上面的代碼,就為類class1添加了一個靜態屬性和靜態方法,並且在靜態方法中引用了該類的靜態屬性。

  如果要給每個函數對象都添加通用的靜態方法,還可以通過函數對象所對應的類Function來實現,例如:

//給類Function添加原型方法:show ArgsCount
Function.prototype.showArgsCount=function(){
 alert(this.length); //顯示函數定義的形參的個數
}
function class1(a){
 //定義一個類
}
//調用通過Function的prototype定義的類的靜態方法showArgsCount
class1. showArgsCount ();
  由此可見,通過Function的prototype原型對象,可以給任何函數都加上通用的靜態成員,這在實際開發中可以起到很大的作用,比如在著名的prototype-1.3.1.js架構中,就給所有的函數定義了以下兩個方法:

//將函數作為一個對象的方法運行
Function.prototype.bind = function(object) {
 var __method = this;
 return function() {
  __method.apply(object, arguments);
 }
}
//將函數作為事件監聽器
Function.prototype.bindAsEventListener = function(object) {
 var __method = this;
 return function(event) {
  __method.call(object, event || window.event);
 }
}
  這兩個方法在prototype-1.3.1架構中起了很大的作用,具體含義及用法將在後面章節介紹。

相關文章

聯繫我們

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