-
私有變量
js中沒有私有成員的概念,所有對象屬性都是公有的,但是卻是有私有變量的概念。
任何函數中定義的變量都是私有變量,因為不能在函數的外部訪問這些變量。
私有變量包含:函數的參數,局部變量,和在函數內部定義的其他函數。 -
特權方法
如果在一個函數的內部創建一個閉包,那么閉包通過自己的作用域鏈也可以訪問這些變量。
稱這個閉包為特權方法。
-
定義特權方法
-
在構造函數中定義特權的方法
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
這個為特權方法。
同樣也是閉包的一個應用,定義特權方法。
【缺點】每個構造函數的實例都會創建同樣一組方法。 -
通過在私有作用域中定義私有變量或函數,以及特權方法
利用私有作用域實現私有變量
-
利用在私有作用域內,全局構造函數的原型內定義特權方法,使之可以訪問私有作用域的私有變量。
(function(){
var privateVariable=10;
function privateFunction(){
return false;
}
Mobject=function(){}; //使用函數聲明,只能創建局部構造函數, //這樣使得構造函數可以在私有作用域外部聲明變量 Mobject.prototype.publicMeth=function(){ alert(privateVariable); return privateFunction(); } })() var obj=new Mobject(); alert(obj.publicMeth()); //10...false
-
在構造函數中定義特權的方法
-
道格拉斯所說的模塊模式,為單例創建私有變量和特權方法**
之前都是為某一類實例創造私有變量與構造函數。
模塊則是為單例。
var singleton=(function(){
var privateVariable=10;
function privateFunction(){
return false;
}
return{
publicProperty:true,
publicMethod:function(){
alert(privateVariable);
return privateFunction();
}
}
})();
alert(singleton.publicMethod())
在web應用中,經常需要使用一個單例來管理應用程序級的信息。
當我們必須創建一個對象,且要以某些數據對齊初始化,同時公開一些訪問這些私有數據的方法,可以使用模塊模式。
很明顯,要想獲得私有變量值,我們需要多重查找,影響了查找速度,,引用閉包也會造成需要維護額外的作用域,導致內存泄露。