您的位置:首页 > Web前端 > JavaScript

javascript私有变量

2016-04-25 19:38 369 查看


私有变量

严格来说,javascript是没有私有成员的概念的,所有对象属性都是公开的。
不顾,任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数外部访问这些变量。私有变量包括函数参数,局部变量以及在函数内部定义的其他函数。通过上一节对闭包概念的学习,可以知道,虽然外部无法访问函数内部的私有变量,但闭包函数却能始终持有这些私有变量,并在外部访问。
如下,通过创建闭包,利用其作用域链提供私有变量的公有访问方法:
function MyObject(){
//私有变量和私有函数
var privateVariable = 20;
function privateFunction(){
return true;
}

//共有方法
this.publicMethod = function(){
privateVariable ++;
return privateFunction();
}
}

这是一个构造函数,当函数执行完毕,本身的作用域链将被销毁,然而却有实例持有函数中的变量对象,因此其中的变量不会被销毁。
于是,每个实例都有了自己的私有成员,且互不影响。
但是,问题是共有方法是在构造函数中定义的,因为想要访问这些私有变量只能这样,于是每次调用构造函数都会重新创建共有方法。这就相当于只能使用构造函数模式来达到目的,缺点是每个实例会创建同样的方法,下面将使用静态私有变量来解决这个问题。


静态私有变量

基本模式如下:
(function(){
//私有变量和函数
var privateVariable = 20;
function privateFunction(){
return true;
}
//构造函数
MyObject = function(){};
//共有方法
MyObject.prototype.publishMethod = function(){
privateVariable++;
return privateFunction();
}
})();


想要定义的函数立刻执行,那么就要在方法外加一层括号,在最后加一对括号
之所以要用这种立即执行的函数,是因为想要这一个代码块中变量不被外界使用,即私有作用域
没有用函数声明的方式定义构造函数,是因为不能定义局部函数,局部函数会在私有作用域结束后销毁
MyObject没有var声明,因为我们希望MyObject是一个全局变量,这样才能在外界创建实例
方法定义在了原型上,使用原型模式而不是构造函数模式

但是,这种方式下创建的静态私有变量是被所有实例共享的,一旦某个实例修改该变量,那么所有实例都会被影响。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: