js基礎(chǔ):Javascript中公有成員,私有成員,靜態(tài)成員
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
一、實(shí)現(xiàn)類(lèi)的公有成員: 1) 定義的成員屬性和方法能夠被任何實(shí)例訪問(wèn),對(duì)任何的實(shí)例都是公開(kāi)的,成為公有成員。在javascript中,一般的屬性和方法的定義都是公有的,請(qǐng)看下面的例子:function class1(){ this.prop=1; this.showProp(); } //創(chuàng)建一個(gè)類(lèi)的實(shí)例 var obj1=new class1(); class1.prototype.showProp=function(){ alert(this.prop); } 2) 以上class1中的屬性,方法都是公共的,屬于任何實(shí)例對(duì)象。 二、實(shí)現(xiàn)類(lèi)的私有成員: 1) 私有成員即是在內(nèi)部實(shí)現(xiàn)中可以共享的成員,但是并不對(duì)外公開(kāi)。Javascript中并沒(méi)有特殊的機(jī)制來(lái)實(shí)現(xiàn)私有成員,但是可以用一些技巧來(lái)實(shí)現(xiàn)這個(gè)功能。 2) 這個(gè)技巧主要是通過(guò)變量的作用域性質(zhì)來(lái)實(shí)現(xiàn)的,在Javascript中,一個(gè)函數(shù)內(nèi)部定義的變量稱(chēng)為局部變量,該變量不是被函數(shù)外的程序訪問(wèn),卻可以被函數(shù)內(nèi)部定義的嵌套函數(shù)訪問(wèn)。在實(shí)現(xiàn)私有成員的過(guò)程中,正是利用了這一性質(zhì)。 3) 在類(lèi)的構(gòu)造函數(shù)中可以為類(lèi)添加成員,通過(guò)這種方式來(lái)定義類(lèi)的成員,實(shí)際上共享了構(gòu)造函數(shù)內(nèi)部定義的局部變量,這些變量就可以看作為類(lèi)的私有成員,例如: 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(); //在公有成員中調(diào)用私有方法。 } } var obj1=new class1(); obj1.method1(); obj2.method2(); 4) 這樣,就實(shí)現(xiàn)了私有屬性pp和私有方法pm。運(yùn)行完class1以后,盡管看上去pp和pm這些局部變量應(yīng)該隨即消失,但實(shí)際上因?yàn)閏lass1是通過(guò)new來(lái)運(yùn)行的,它所屬的對(duì)象還沒(méi)有消失,所以仍然可以通過(guò)公開(kāi)成員來(lái)對(duì)他們進(jìn)行操作。 5) 要使用私有成員,是以犧牲代碼的可讀性為代價(jià)的。而且這種實(shí)現(xiàn)更多的是一樣Javascript技巧,看上去也比較勉強(qiáng),因?yàn)樗⒉皇钦Z(yǔ)言本身具有的機(jī)制。但種利用變量作用域性質(zhì)的技巧,卻是值得借鑒的。 三、實(shí)現(xiàn)類(lèi)的靜態(tài)成員: 1) 和私有成員的勉強(qiáng)相比,靜態(tài)成員顯得“正統(tǒng)”的多。靜態(tài)成員屬于一個(gè)類(lèi)的成員,它可以通過(guò)“類(lèi)名.靜態(tài)成員名”的方式訪問(wèn)。在javascript中,可以給一個(gè)函數(shù)對(duì)象直接添加成員實(shí)現(xiàn)靜態(tài)成員,因?yàn)楹瘮?shù)也是一個(gè)對(duì)象,所以對(duì)象的相關(guān)操作,對(duì)函數(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(); 2) 通過(guò)上面的代碼,就為類(lèi)class1添加了一個(gè)靜態(tài)屬性和靜態(tài)方法,并且在靜態(tài)方法中引用了該類(lèi)的靜態(tài)屬性。 3) 如果要給每個(gè)函數(shù)對(duì)象對(duì)添加通用的靜態(tài)方法,還可以通過(guò)函數(shù)對(duì)象所對(duì)應(yīng)的類(lèi)function來(lái)實(shí)現(xiàn),例如: //給類(lèi)Function添加原型方法:showArgsCount Function.prototype.showArgsCount=function(){ alert(this.length); //顯示函數(shù)定義的形參的個(gè)數(shù) } function class1(a){ //定義一個(gè)類(lèi) } //調(diào)用通過(guò)Function的property定義的類(lèi)的靜態(tài)方法showArgsCount class1.showArgsCount(); 4) 由此可見(jiàn),通過(guò)Function的property原型對(duì)象,可以給任何函數(shù)都加上通用的靜態(tài)成員,這在實(shí)際中可起到很大的作用,比如在著名的prototype-1.3.1.js框架中,就給所有的函數(shù)定義了以下兩個(gè)方法: //將函數(shù)做為一個(gè)對(duì)象的方法運(yùn)行 Function.prototype.bind=function(object){ var _method=this; return function(){ _method.apply(object,arguments); } } //將函數(shù)作為事件鑒聽(tīng)器 Function.prototype.bindAsEventListener=function(object){ var _method=this; return function(event){ _mehtod.call(object,event||window.event); } }
該文章在 2010/8/18 10:31:01 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |