js基礎:Javascript中公有成員,私有成員,靜態成員
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
一、實現類的公有成員: 1) 定義的成員屬性和方法能夠被任何實例訪問,對任何的實例都是公開的,成為公有成員。在javascript中,一般的屬性和方法的定義都是公有的,請看下面的例子:function class1(){ this.prop=1; this.showProp(); } //創建一個類的實例 var obj1=new class1(); class1.prototype.showProp=function(){ alert(this.prop); } 2) 以上class1中的屬性,方法都是公共的,屬于任何實例對象。 二、實現類的私有成員: 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技巧,看上去也比較勉強,因為它并不是語言本身具有的機制。但種利用變量作用域性質的技巧,卻是值得借鑒的。 三、實現類的靜態成員: 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); } }
該文章在 2010/8/18 10:31:01 編輯過 |
關鍵字查詢
相關文章
正在查詢... |