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

相关文章
相关标签/搜索