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