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框架中起了很大的作用,具體含義及用法將在後面章節介紹。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章