4)公有成员\私有成员和静态成员
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                4)公有成员\私有成员和静态成员
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            1)實現類的公有成員.
??? 前面定義的任何類成員都屬于公有成員的范疇,該類的任何實例都對外公開這些屬性和方法.
???
??? 2)實現類的私有成員.
??? 私有成員,即只在類的內部實現中可以共享訪問的成員,不對外公開.
??? JavaScript并沒有提供特殊的機制來定義私有成員,但可以用一些技巧來實現這個功能.
??? 這個技巧主要是通過變量的作用域來實現的.在JavaScript中,一個函數內部定義的變量稱為局部變量,該變量不能被函數外的程序所訪問,卻可以被函數內部定義的嵌套函數所訪問.在實現私有成員的過程中,正利用了這一性質.
??? 在類的構造函數中可以為類添加成員,通過這種方式定義的類成員,實際上共享了在構造函數內部定義的局部變量,這些變量就可以看作類的私有成員,因為它符合了私有成員的定義(內部可訪問,外部不可訪問.)
??? 如下:
function?class1(){
????var?pp?=?"this?is?a?private?property.";?//私有屬性成員pp
????function?pm(){??????//私有方法
????????alert(pp);
????}
????this.method1?=?function(){
????????//在公有成員方法中改變私有屬性的值.
????????pp="pp?has?been?changed";
????}
????this.method2?=?function(){
????????//在公有成員方法中調用私有方法
????????pm();
????}
}
var?obj1?=?new?class1();
obj1.method2();?
obj1.method1();?
obj1.method2();?這里,就實現了私有屬性pp和私有方法pm.
??? 實現原理:運行完class1之后,盡管看上去pp和pm這些局部變量應該隨即消失,但實際上因為class1是通過new來運行的,它所屬的對象還沒消失,所以仍然可以通過公開成員來對它們進行操作.
??? 注意:這些局部變量(私有成員),被所有在構造函數中定義的公有方法所共享,而且僅被在構造函數中定義的公有方法所共享,這意味著,在prototype 中定義的類成員將不能訪問在構造器函數中定義的局部變量(私有成員),這算是一點缺陷.
??? 使用私有成員,是以犧牲代碼可讀性為代價的。而且這種實現更多的是一種JavaScript技巧,因為它并不是語言本身具有的機制。但這種利用變量作用域性質的技巧,卻是值得借鑒的。
???
??? 3)實現靜態成員
??? 靜態成員屬于一個類的成員,它可以通過"類名.靜態成員名"的方式訪問.
??? 在JavaScript中,可以給一個函數對象直接添加成員來實現靜態成員,因為函數也是一個對象,所以對象的相關操作,對函數也同樣適用.例如:
function?class1(){//構造函數
}
//靜態屬性
class1.staticProperty="sample";
//靜態方法
class1.staticMethod=function(){
??????alert(class1.staticProperty);
}
//調用靜態方法
class1.staticMethod();??? 通過上面的代碼,就為類class1添加了一個靜態屬性和靜態方法,并且在靜態方法中訪問了該類的靜態屬性.
??? 如果要給每個函數對象都添加通用的靜態方法,這就需要通過函數對象所定義的基類:Function來實現(同樣,要為所有的對象添加方法,用Object來實現),例如:
//給類Function添加原型方法:show?ArgsCount
Function.prototype.showArgsCount=function(){
??????alert(this.length);????//顯示函數定義的形參的個數
}
function?class1(a,b){
??????//定義一個類
}
//調用通過Function的prototype定義的類的靜態方法showArgsCount
class1.?showArgsCount?();??? 可見,通過Function的prototype原型對象,可以給任何函數都加上通用的靜態成員,這在實際開發中可以起到很大的作用,比如在著名的prototype.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);
??}
}
 
 
                        
                        
                        ??? 前面定義的任何類成員都屬于公有成員的范疇,該類的任何實例都對外公開這些屬性和方法.
???
??? 2)實現類的私有成員.
??? 私有成員,即只在類的內部實現中可以共享訪問的成員,不對外公開.
??? JavaScript并沒有提供特殊的機制來定義私有成員,但可以用一些技巧來實現這個功能.
??? 這個技巧主要是通過變量的作用域來實現的.在JavaScript中,一個函數內部定義的變量稱為局部變量,該變量不能被函數外的程序所訪問,卻可以被函數內部定義的嵌套函數所訪問.在實現私有成員的過程中,正利用了這一性質.
??? 在類的構造函數中可以為類添加成員,通過這種方式定義的類成員,實際上共享了在構造函數內部定義的局部變量,這些變量就可以看作類的私有成員,因為它符合了私有成員的定義(內部可訪問,外部不可訪問.)
??? 如下:
function?class1(){
????var?pp?=?"this?is?a?private?property.";?//私有屬性成員pp
????function?pm(){??????//私有方法
????????alert(pp);
????}
????this.method1?=?function(){
????????//在公有成員方法中改變私有屬性的值.
????????pp="pp?has?been?changed";
????}
????this.method2?=?function(){
????????//在公有成員方法中調用私有方法
????????pm();
????}
}
var?obj1?=?new?class1();
obj1.method2();?
obj1.method1();?
obj1.method2();?這里,就實現了私有屬性pp和私有方法pm.
??? 實現原理:運行完class1之后,盡管看上去pp和pm這些局部變量應該隨即消失,但實際上因為class1是通過new來運行的,它所屬的對象還沒消失,所以仍然可以通過公開成員來對它們進行操作.
??? 注意:這些局部變量(私有成員),被所有在構造函數中定義的公有方法所共享,而且僅被在構造函數中定義的公有方法所共享,這意味著,在prototype 中定義的類成員將不能訪問在構造器函數中定義的局部變量(私有成員),這算是一點缺陷.
??? 使用私有成員,是以犧牲代碼可讀性為代價的。而且這種實現更多的是一種JavaScript技巧,因為它并不是語言本身具有的機制。但這種利用變量作用域性質的技巧,卻是值得借鑒的。
???
??? 3)實現靜態成員
??? 靜態成員屬于一個類的成員,它可以通過"類名.靜態成員名"的方式訪問.
??? 在JavaScript中,可以給一個函數對象直接添加成員來實現靜態成員,因為函數也是一個對象,所以對象的相關操作,對函數也同樣適用.例如:
function?class1(){//構造函數
}
//靜態屬性
class1.staticProperty="sample";
//靜態方法
class1.staticMethod=function(){
??????alert(class1.staticProperty);
}
//調用靜態方法
class1.staticMethod();??? 通過上面的代碼,就為類class1添加了一個靜態屬性和靜態方法,并且在靜態方法中訪問了該類的靜態屬性.
??? 如果要給每個函數對象都添加通用的靜態方法,這就需要通過函數對象所定義的基類:Function來實現(同樣,要為所有的對象添加方法,用Object來實現),例如:
//給類Function添加原型方法:show?ArgsCount
Function.prototype.showArgsCount=function(){
??????alert(this.length);????//顯示函數定義的形參的個數
}
function?class1(a,b){
??????//定義一個類
}
//調用通過Function的prototype定義的類的靜態方法showArgsCount
class1.?showArgsCount?();??? 可見,通過Function的prototype原型對象,可以給任何函數都加上通用的靜態成員,這在實際開發中可以起到很大的作用,比如在著名的prototype.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);
??}
}
轉載于:https://www.cnblogs.com/fcrong/archive/2006/08/16/478064.html
總結
以上是生活随笔為你收集整理的4)公有成员\私有成员和静态成员的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 改善DataGrid的默認分頁使其更友好
- 下一篇: 开通了!!哈哈
