標籤:style blog color io 使用 ar div cti sp
有權訪問私人變數和私人函數的公有方法稱之為特權方法,對象上建立特權方法的方式有兩種。
第一種:直接在建構函式中定義特權方法,基本模式如下
function MyObject(){ var privateVariable = 10; function privateFunction(){ alert(1); } this.publicMethod = function(){ privateVariable++; return privateFunction(); }//特權方法}var aa = new MyObject();aa.publicMethod();
this.publicMethod 方法作為MyObject函數的閉包因而有權訪問在建構函式中定義的變數和方法,aa執行個體中,除了用publicMethod()這個特權方法來訪問外,沒有任何其他辦法直接存取privateVariable和privateFunction()。在這個執行個體中
publicMethod()即為 建構函式MyObject的特權方法之一。
建構函式中定義特權方法有一個缺點,就是必須使用建構函式模式來達到這個目的,而建構函式模式的缺點是每個執行個體都會建立同樣的一組新方法。
靜態私人變數
通過在私人範圍中定義私人變數或函數同樣可以建立特權方法,基本模式如下
(function(){ var praviteVariable = 10; function praviteFunction(){ return false; } MyObject = function(){ } MyObject.prototype.publicMethod = function(){ privateVariable++; return privateFunction(); }})();
這個模式中建立了一個私人範圍,裡面封裝了一個建構函式。公有方法使用了原型定義,這個模式在定義建構函式式沒有使用函式宣告,也沒有在聲明MyObject時使用var,那麼由於未經初始化的變數總是會建立一個全域變數的緣故,MyObject就此成為了一個全域變數,能夠在私人範圍之外被訪問到。
這種模式與建構函式中定義特權方法的主要區別在於,這種方法下私人變數和函數是由執行個體共用的,由於這個特權方法實在原型上定義的,因此所有的執行個體都使用同一個函數,但是因為這個特權方法是作為一個閉包,因此這個閉包總是包含著範圍的引用,導致的後果就是每個建立的執行個體所使用引用的變數都是一樣的,即不管哪個執行個體改變了變數的值,其他執行個體中這個變數的值也會被改變,因為這個特權方法總是儲存著對包含範圍的作用。
關於私人變數,靜態私人變數