1、實現類的公有成員:javascript
1) 定義的成員屬性和方法可以被任何實例訪問,對任何的實例都是公開的,成爲公有成員。在javascript中,通常的屬性和方法的定義都是公有的,請看下面的例子:function class1(){java
this.prop=1;app
this.showProp();框架
}函數
//建立一個類的實例this
var obj1=new class1();prototype
class1.prototype.showProp=function(){對象
alert(this.prop);事件
}ip
2) 以上class1中的屬性,方法都是公共的,屬於任何實例對象。
2、實現類的私有成員:
1) 私有成員便是在內部實現中能夠共享的成員,可是並不對外公開。Javascript中並無特殊的機制來實現私有成員,可是能夠用一些技巧來實現這個功能。
2) 這個技巧主要是經過變量的做用域性質來實現的,在Javascript中,一個函數內部定義的變量稱爲局部變量,該變量不是被函數外的程序訪問,卻能夠被函數內部定義的嵌套函數訪問。在實現私有成員的過程當中,正是利用了這一性質。
3) 在類的構造函數中能夠爲類添加成員,經過這種方式來定義類的成員,實際上共享了構造函數內部定義的局部變量,這些變量就能夠看做爲類的私有成員,例如:
function class1(){
var pp=」this is a private property」; //私有屬性成員pp,
function pm(){ //私有方法成員,顯示pp的值
alert(pp);
}
this.method1=function(){
//在公有成員中改變私有屬性的值
pp=」pp has bean changed」;
}
this.method2=function(){
pm(); //在公有成員中調用私有方法。
}
}
var obj1=new class1();
obj1.method1();
obj2.method2();
4) 這樣,就實現了私有屬性pp和私有方法pm。運行完class1之後,儘管看上去pp和pm這些局部變量應該隨即消失,但實際上由於class1是經過new來運行的,它所屬的對象尚未消失,因此仍然能夠經過公開成員來對他們進行操做。
5) 要使用私有成員,是以犧牲代碼的可讀性爲代價的。並且這種實現更多的是同樣Javascript技巧,看上去也比較勉強,由於它並非語言自己具備的機制。但種利用變量做用域性質的技巧,倒是值得借鑑的。
3、實現類的靜態成員:
1) 和私有成員的勉強相比,靜態成員顯得「正統」的多。靜態成員屬於一個類的成員,它能夠經過「類名.靜態成員名」的方式訪問。在javascript中,能夠給一個函數對象直接添加成員實現靜態成員,由於函數也是一個對象,因此對象的相關操做,對函數一樣適用。例如:
function class1(){//構造函數
}
//靜態屬性
class1.staticProperty=」sample」;
//靜態方法
class1.staticMethod=function(){
alert(class1.staticProperty);
}
//調用靜態方法
class1.staticMethod();
2) 經過上面的代碼,就爲類class1添加了一個靜態屬性和靜態方法,而且在靜態方法中引用了該類的靜態屬性。
3) 若是要給每一個函數對象對添加通用的靜態方法,還能夠經過函數對象所對應的類function來實現,例如:
//給類Function添加原型方法:showArgsCount
Function.prototype.showArgsCount=function(){
alert(this.length); //顯示函數定義的形參的個數
}
function class1(a){
//定義一個類
}
//調用經過Function的property定義的類的靜態方法showArgsCount
class1.showArgsCount();
4) 因而可知,經過Function的property原型對象,能夠給任何函數都加上通用的靜態成員,這在實際中可起到很大的做用,好比在著名的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){
_mehtod.call(object,event||window.event);
}
}