JavaScript私有变量用法详解
来源:自学PHP网
时间:2014-09-19 14:47 作者:
阅读:次
[导读] 私有实例变量的原理是根据作用域。私有实例变量是在 JavaScript 的 function 内部用 var 关键字实现,只在 function 内部有效。...
如果接触过其它语言的,应该会接触过私有变量这一个概念。所谓私有就是没有受保护,不能修改与访问,只能通过你给的API接口访问与修改。但是在JavaScript中并没有私有变量这个概念,所有成员都可以通过下标访问与修改,如:
私有变量
代码如下 |
复制代码 |
var F = function(){};
F.prototype.name = "zhangsan";
var a = new F();
alert( a.name ); // zhangsan
a.name = "lisi";
alert( a.name ); // lisi
|
在JavaScript里,实例的成员变量就这样轻而易举的被修改,设置delete。有不少这么干
代码如下 |
复制代码 |
var F = function(){};
// 变量前面加下划线
F.prototype._name = "zhangsan";
var a = new F();
// 访问跟正常访问一样
alert( a._name ); // zhangsan
// 实际上也能轻而易举的被修改
a._name = "lisi";
alert( a._name ); // lisi
|
加下划线做位私有变量貌似很普遍,认可。但这仅是一种大家默认的公约,其实利用JavaScript特性,我们可以这样定义私有变量:
代码如下 |
复制代码 |
(function(window){
// 定义私有变量默认值
var name = "zhangsan";
var F = function(){};
// 访问私有变量
F.prototype.getName = function(){
return name;
};
// 更新私有变量
F.prototype.setName = function(str){
name = str;
};
window.F = F;
})(window);
var a = new F();
a.getName(); // zhangsan
a.setName("lisi");
a.getName(); // lisi
|
这种方式也是被使用最多最广泛的方式。
私有静态变量
代码如下 |
复制代码 |
<script language="javascript" type="text/javascript">
var JSClass = (function() {
var privateStaticVariable = "nowamagic";
var privateStaticMethod = function() {
alert("nowamagic");
};
return function() {
this.test1 = function() {
return privateStaticVariable;
}
this.test2 = function(obj) {
privateStaticVariable = obj;
}
this.test3 = function() {
privateStaticMethod();
}
};
})();
var testObject1 = new JSClass();
var testObject2 = new JSClass();
alert(testObject1.test1());
testObject1.test2("change nowamagic");
alert(testObject2.test1());
testObject2.test3();
</script>
|
动态生成私有变量访问器
代码如下 |
复制代码 |
//创建一个新的用户对象,接受一个有许多属性的对象作为参数
function User(properties)
{
//遍历该对象的所有属性,并保证其作用域正确
for(var i in properties){
(function(which){
var p=i;
//创建此属性的一个新的读取器(getter)
which["get"+p]=function(){
return properties[p];
};
//创建此属性的一个新的设置器(setter)
which["set"+p]=function(val)
{
properties[p]=val;
};
})(this);
}
}
//创建一个新的用户对象实例,并把具有两个属性的一个对象传入作为参数
var user=new User({name:"Bob",age:44});
//读取属性值
alert(user.getname());
//设置属性值
user.setage(23);
|
|