-
私有變量
js中沒(méi)有私有成員的概念,所有對(duì)象屬性都是公有的浸遗,但是卻是有私有變量的概念猫胁。
任何函數(shù)中定義的變量都是私有變量,因?yàn)椴荒茉诤瘮?shù)的外部訪問(wèn)這些變量乙帮。
私有變量包含:函數(shù)的參數(shù)杜漠,局部變量,和在函數(shù)內(nèi)部定義的其他函數(shù)察净。 -
特權(quán)方法
如果在一個(gè)函數(shù)的內(nèi)部創(chuàng)建一個(gè)閉包驾茴,那么閉包通過(guò)自己的作用域鏈也可以訪問(wèn)這些變量。
稱這個(gè)閉包為特權(quán)方法。
-
定義特權(quán)方法
-
在構(gòu)造函數(shù)中定義特權(quán)的方法
function Myobject(){
var privateVariable=10;
function privateFunction(){
return false;
}
this.publicMethod=function(){
alert(privateVariable);
return privateFunction();
}
}
var obj=new Myobject();
alert(obj.publicMethod()); //10...false
publicMethod
這個(gè)為特權(quán)方法。
同樣也是閉包的一個(gè)應(yīng)用钥星,定義特權(quán)方法奴拦。
【缺點(diǎn)】每個(gè)構(gòu)造函數(shù)的實(shí)例都會(huì)創(chuàng)建同樣一組方法嚷那。 -
通過(guò)在私有作用域中定義私有變量或函數(shù),以及特權(quán)方法
利用私有作用域?qū)崿F(xiàn)私有變量
-
利用在私有作用域內(nèi),全局構(gòu)造函數(shù)的原型內(nèi)定義特權(quán)方法,使之可以訪問(wèn)私有作用域的私有變量们拙。
(function(){
var privateVariable=10;
function privateFunction(){
return false;
}
Mobject=function(){}; //使用函數(shù)聲明,只能創(chuàng)建局部構(gòu)造函數(shù)阁吝, //這樣使得構(gòu)造函數(shù)可以在私有作用域外部聲明變量 Mobject.prototype.publicMeth=function(){ alert(privateVariable); return privateFunction(); } })() var obj=new Mobject(); alert(obj.publicMeth()); //10...false
-
在構(gòu)造函數(shù)中定義特權(quán)的方法
-
道格拉斯所說(shuō)的模塊模式砚婆,為單例創(chuàng)建私有變量和特權(quán)方法**
之前都是為某一類實(shí)例創(chuàng)造私有變量與構(gòu)造函數(shù)。
模塊則是為單例突勇。
var singleton=(function(){
var privateVariable=10;
function privateFunction(){
return false;
}
return{
publicProperty:true,
publicMethod:function(){
alert(privateVariable);
return privateFunction();
}
}
})();
alert(singleton.publicMethod())
在web應(yīng)用中装盯,經(jīng)常需要使用一個(gè)單例來(lái)管理應(yīng)用程序級(jí)的信息。
當(dāng)我們必須創(chuàng)建一個(gè)對(duì)象甲馋,且要以某些數(shù)據(jù)對(duì)齊初始化埂奈,同時(shí)公開(kāi)一些訪問(wèn)這些私有數(shù)據(jù)的方法,可以使用模塊模式定躏。
很明顯账磺,要想獲得私有變量值,我們需要多重查找痊远,影響了查找速度绑谣,,引用閉包也會(huì)造成需要維護(hù)額外的作用域拗引,導(dǎo)致內(nèi)存泄露。