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是一个全局变量,这样才能在外界创建实例
方法定义在了原型上,使用原型模式而不是构造函数模式
但是,这种方式下创建的静态私有变量是被所有实例共享的,一旦某个实例修改该变量,那么所有实例都会被影响。
相关文章推荐
- javascript闭包
- jstl c:choose>、<c:when>和<c:otherwise>标签的自定义开发
- js中的 AOP
- [JSOI2016]轻重路径
- JavaScript代码性能优化总结
- javascript 中的闭包
- [JSOI2016]无界单词
- JavaScript入门学习1
- JavaScript入门学习2
- JavaScript入门学习3;基本用法
- JavaScript入门学习4
- JavaScript入门学习5 DOM操作1
- JavaScript高级篇(一)— —高级函数
- [JSOI2016]飞机调度
- 数据可视化工具 dc.js 入门指南
- javascript屏蔽浏览器右键功能按钮
- Js 时间间隔计算(间隔天数)
- Gson中fromJson方法的返回值
- jspSmartUpload上传路径不存在
- 各个JSON技术的比较