Javascript 实现私有成员变量

Javascript 方法中这样写的话,相当于声明了成员变量:

View Code
1 function foo() {
2 this.data =0;
3 }

但当我们试图访问它时仍会出错:

View Code
1 function bar() {
2 // foo.data未定义
3 alert(foo.data);
4 }

这时可以通过使用new关键字来解决,就像我们实例化类一样:

function bar() {
theFoo
=new foo();
alert(theFoo.data);
}

但是问题也来了,Javascript没有访问修饰符,那么将导致所有成员变量都是公有的,为了解决这个问题做个试验,结果就没有办法再访问foo的实例theFoo.data了,这是因为方法调用完毕后,方法体内声明的变量也将消失了,而data现在已经不是成员变量,而是仅仅是方法体中的一个变量:

function foo() {
var data =0;
}

function bar() {
theFoo
=new foo();
// theFoo.data未定义
alert(theFoo.data);
}

但如果在方法退出后仍存一个成员方法在对这个变量进行引用,那么这个变量就仍然会存在,并且只有这个方法才能访问此变量,例如:

function foo() {
var data =0;

this.setData =function () {
data
++;
alert(data
);
}
}

最后写成了这样,调用bar方法试试,没有办法直接访问data变量了,但它的值会累加(方法调用结束后变量没有消失),这样就实现了私有成员变量的模拟:

function foo() {
var data =0;

this.setData =function () {
data
++;
alert(data);
}
}
// 为了防止每次调用bar方法时都新建立foo的实例theFoo
// 将实例化的部分放到了bar的外面
var theFoo =new foo();
function bar() {
theFoo.setData();
}

也许模拟类时更爱这样写,不过这并不是最重要的:

var foo =function () {
var data =0;

this.setData =function () {
data
++;
alert(data);
}
}

笔记做完了。

原文地址:https://www.cnblogs.com/javennie/p/2125842.html