靜態私有變量

經過在私有做用域中定義私有變量和函數,一樣也能夠建立特權方法,其基本模式以下所示。javascript

(function(){
	//私有變量和私有函數
	var privateVariable=10;

	function privateFunction(){
		return false;
	}

	// 構造函數
	MyObject = function (){

	};

	// 公有/特權方法
	MyObject.prototype.publicMethod = function(){
		privateVariable++;
		return privateFunction();
	};
})();

  這個模式建立了一個私有做用域,並在其中封裝了一個構造函數及相應的方法。在私有做用域中,首先定義了私有變量和私有函數,而後又定義了構造函數及其公有方法。公有方法是在原型上定義的,這一點體現了典型的原型模式。須要注意的是,這個模式在定義構造函數時並無使用函數聲明,而是使用了函數表達式。函數聲明只能建立局部函數,但那並非咱們想要的。出於一樣的緣由,咱們也沒有在聲明MyObject時使用var關鍵字。記住:初始化未經聲明的變量,老是會建立一個全局變量。所以,MyObject就成了一個全局變量,可以在私有做用域以外被訪問到。但也要知道,在嚴格模式下給未經聲明的變量賦值會致使錯誤。java

這個模式與在構造函數中定義特權方法的主要區別,就在於私有變量和函數是由實例共享的。因爲特權方法是在原型上定義的,所以全部實例都使用同一個函數,而這個特權方法,做爲閉包,老是保存着對包含做用域的引用。來看一看下面的代碼。閉包

(function(){
	var name = "";
	Person = function(value){
		name=value;
	};
	Person.prototype.getName = function(){
		return name;
	};
	Person.prototype.setName = function(value){
		name = value;
	};
})();

var person1 = new Person("Nicholas");
alert(person1.getName()); // "Nicholas"
person1.setName("Greg");
alert(person1.getName());  // "Greg"


var person2 = new Person("Michael");

alert(person1.getName());  // "Michael"
alert(person2.getName());  // "Michael"

  這個例子中的Person構造函數與getName()和setName()方法同樣,都有權訪問私有變量name。在這種模式下,變量name就變成了一個靜態的、由全部實例共享的屬性。也就是說,在一個實力上調用setName()會影響全部實例。而調用setName()或新建一個Person實例都會賦予name屬性一個新值。結果就是全部實例都會返回相同的值。函數

以這種方式建立靜態私有變量會由於使用原型而增進代碼複用,但每一個實例都沒有本身的私有變量。究竟是使用實例變量,仍是靜態私有變量,最紅仍是要視你的具體需求而定。spa

相關文章
相關標籤/搜索