博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS中如何在外部引用私有变量的两种方法 复习
阅读量:6412 次
发布时间:2019-06-23

本文共 1715 字,大约阅读时间需要 5 分钟。

引用:

运用闭包的特权方法

在构造函数中定义特权方法

  • 这种模式在构造函数中定义了所有私有变量和函数。
  • 能够在构造函数中定义特权方法是因为特权方法作为闭包,能够访问在构造函数中定义的所有变量和函数。
function product(){    var name='yuxiaoliang';    this.getName=function(){        return name;    }}var obj=new product();console.log(obj.getName())// "yuxiaoliang"
function Person(name){   this.getName=function(){     return name;   };   this.setName=function(value){     name=value;   }; } var person=new Person('Lee'); alert(person.getName());//'Lee' person.setName('lwf'); alert(person.getName());//'lwf'
  • 私有变量name在Person的每个实例中都不相同,因为每次调用构造函数都会重新创建这两个方法。
  • 构造函数模式的缺点就是针对每个实例都会创建同样一组新方法,而使用静态私有变量来实现特权方法就可以避免这个问题。

静态私有变量

(function(){    //私有变量和私有函数    var privateVariable = 10;        function privateFunction(){        return false;    }        //构造函数    MyObject = function(){    }        //公有/特权方法    MyObject.prototype.publicMethod = function(){        privateVariable ++;        return privateFunction();    }    })();var object = new MyObject();console.log(object.publicMethod());//false

 

  • 上面模式在定义构造函数时并没有使用函数声明,而是使用了函数表达式。函数声明只能创建局部函数,我们需要在私有作用域外面使用构造函数。声明MyObject时也没有使用var,这样MyObject就成了一个全局变量,能够在私有作用域之外被访问。

  • 由于特权方法是在原型上定义的,因此所有的实例都使用同一个函数,而这个特权方法,作为一个闭包,总是保存着对包含作用域的引用。

(function(){    var name = '';       Person = function(value){        name  = value;         }    Person.prototype.getName = function(){        return name;    }    Person.prototype.setName = function(value){          name = value;    }})();var person1 = new Person('Tom');var person2 = new Person('Lucy');console.log(person1.getName());//Lucyconsole.log(person2.getName());//Lucy

 

  • 这个例子Person构造函数和getName()和setName()方法都能访问私有变量name,变量name就变成了一个静态的、所有实例共享的属性。也就是在一个实例上调用setName()会影响所有的实例。

转载于:https://www.cnblogs.com/xiaoyuchen/p/10547952.html

你可能感兴趣的文章
如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库...
查看>>
[20171113]修改表结构删除列相关问题3.txt
查看>>
特征选择
查看>>
在Winform程序中设置管理员权限及为用户组添加写入权限
查看>>
RTMP直播到FMS中的AAC音频直播
查看>>
多能互补提速 加快我国能源转型和现代能源体系建设
查看>>
音乐闹钟
查看>>
Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
查看>>
9.2 空间拓扑运算[转]
查看>>
监控视频相关数据集
查看>>
(转)android UI进阶之弹窗的使用(2)--实现通讯录的弹窗效果
查看>>
面试经典-设计包含min函数的栈
查看>>
linux下php添加cur/soapl扩展
查看>>
【百度地图API】多家地图API文件大小对比
查看>>
也可以使用如下命令更改您的默认 Shell
查看>>
Windows系统中IIS 6.0+Tomcat服务器环境的整合配置过程
查看>>
2015-03-15
查看>>
Node.js HTTP Server对象及GET、POST请求
查看>>
"npm ERR! Error: EPERM: operation not permitted"问题解决
查看>>
linux tar包追加问题【转】
查看>>