js中的私有變量

模仿塊級做用域(私有做用域)

(function() {
	// 塊級做用域
})();

// 訪問不到塊級做用域
複製代碼

這種方法能夠限制向全局做用域中添加過多的變量和函數,同時還能夠減小閉包占用的內存問題,由於沒有指向匿名函數的引用。只要函數執行完畢就能夠當即銷燬做用域鏈。javascript

私有變量

默認狀況下,函數內部的變量是私有的,外部訪問不到。 若是在函數內部建立一個閉包,閉包則能夠訪問這些內部變量。 經過這個原理,能夠建立用於訪問私有變量的公有方法。java

特權方法:能夠訪問私有變量和私有函數的公有方法api

建立私有變量的方法:閉包

方法一 構造函數

// 在構造函數內部定義了私有變量name
// 定義了特權方法getName setName

// 特權方法做爲閉包有權訪問name

// 每一個實例的name都是獨立的
// 每一個實例的特權方法也是從新建立的,沒法共享,這也是缺點所在

function Person(name) {
	this.getName = function() {
		return name;
	};
	this.setName = function(value) {
		name = value;
	}
}

var tc = new Person('tc');
var dj = new Person('dj');
tc.getName(); // tc
dj.getName(); // dj
複製代碼

優勢: 每一個實例都有本身的私有變量 缺點: 必須使用構造函數模式,針對每一個實例都會建立一樣一組新方法函數

方法二 靜態私有變量

// 當即執行函數建立了一個私有做用域

// name爲私有變量
// Person沒有使用函數聲明,而是函數表達式,是由於函數聲明只能定義局部函數,在這裏是定義私有方法才用的
// Person沒有用var定義,默認爲全局變量

// 特權方法定義在原型上,因此能夠被實例共享
// 可是私有變量被全部實例共享,一個實例改變了私有變量,其餘實例均受影響,因此這也是缺點

(function() {
	var name = '';

	Person = function(value) {
		name = value;
	};

	Person.prototype.getName = function() {
		return name;
	};

	Person.prototype.setName = function(value) {
		name = value;
	};

})();

var tc = new Person('tc');
tc.getName();  // tc

var dj = new Person('dj');
tc.getName(); // dj
複製代碼

優勢: 公有方法是全部實例共享的 缺點: 私有變量是靜態的(由全部實例共享)this

模塊模式

以前的模式都使用了new操做符,因此是用於自定義類型建立私有變量和特權方法的。 模塊模式則是爲單例建立私有變量和特權方法的。spa

// 當即執行函數返回一個對象
// 這個對象提供特權方法的接口api
var person = (function() {

	// 初始化
	// 私有變量
	var name = 'tc';

	return {
		getName: function() {
			return name;
		},
		setName: function(value) {
			name = value;
		}
	}

})();
複製代碼

這種模式在爲單例進行初始化,同時維護私有變量時很是有用。prototype

相關文章
相關標籤/搜索