最近因为做了一个项目,其中涉及到了js私有方法,这个概念在其语言里面是很常见的,很多语言都有private这个关键字,只要在一个类的前面加上private就表示申明了一个私有方法,但是javascript在面向对象的方面没有那么多的特征,他没有专门的private关键字,。要做到这一点就必须使用js自己的一些特性来变相的完成。

首先javascript里面有一个高级特性叫闭包,简单的说js的闭包可以理解成是一种现象或者特性,一般出现在两个函数嵌套的情况下,看例子:

function a(){
var eg = 1;
return function(){
alert(eg);
  }
}
var c = a();

a函数里返回了一个函数,返回的函数被全局作用域下的c接受了,此时因为返回的函数调用了a函数里面的eg变量,并且被全局作用域下的变量c引用,此时下形成闭包,a函数的内存空间不会被收回,这个闭包的理解其实和js的垃圾回收机制有关,js的垃圾回收其实是靠引用来计算的,比如我们申明了一个函数,这个函数就会有一个引用指向他自己,当函数运行结束的时候销毁引用,js如果发现没有引用的函数就会销毁这个函数的内存空间,函数也就没有了。我们上面的例子中首先a函数运行,给eg赋值1,然后返回一个匿名函数,到此a函数运行完了,按照原有的理论,此时a函数应该被销毁,但是此时他返回了一个函数,这个函数被全局下的变量c引用,c是不会被销毁的,除非我们手动销毁,而且这个返回的函数引用了a函数的变量eg,js引擎会认为eg依然是有用的,因为他仍然在被使用,因此包含eg这个局部变量的函数a也不会被销毁。

闭包的理解可能不是一下讲的通的,这里其实还涉及到一个作用域的问题,我记得以前有人说返回的这个函数被c接收了,c是在全局作用下的,为什么调用c的时候会弹出a函数里面的eg,难道不应该是全局作用域下的eg吗?而且js的函数作用于是局部的,外部不能访问。其实这里有一个理论,记住就可以,js里的函数作用域取决于函数定义的位置,而不是函数调用的位置,也就是说,函数在什么地方定义的,他的作用域就决定了,不管他在什么地方调用,作用域都不会改变,返回的这个匿名函数是在a函数里面定义的,所以他的上级作用域就是这个a函数,而不是全局作用域。

这里要说的私有方法其实和闭包是有关系的,私有方法在其他语言里面是不被访问到的,除非有专门的接口,js的局部作用域里面的东西在正常情况下也是不能被外部访问到,但是上面例子显示了,通过闭包的方式可以访问到,这样我们就可以利用这个特性,看例子:

var book = (function(){
var page = 100;
return function(){
this.auther = 'dava';
this.price = 200;
this._page = function(){
alert(page);
}
}
})();

var a = new book();
a.auther//"dava"
a.price//   200
a.page//"wrong"
a._page()//   100
这里例子用了一个函数自动执行,一上来就执行了一个匿名函数,并且在匿名函数里面定义了一个局部变量page,然后又返回了一个匿名函数,并且被全局作用域下的book变量接收,此时使用new 调用book就会生成一个新对象a。其中auther属性和price属性可以直接通过对象访问,因为这些属性都是new的时候直接定义在返回的对象身上的,而page属性则没有,因此不能反回,但此时如果我想访问page属性,那就得依靠闭包了,返回的函数在外层的匿名函数里面,因此在返回的函数身上定义了一个方法叫_page,这个方法弹出了page属性,按照js作用域的关系,当前作用域找不到page,就会到上层作用域去寻找,这样就找到了。通过这种方式我们就把私有方法和公有方法区分开了。

转载于:https://www.cnblogs.com/shibaxiong/p/5073372.html

javascript使用闭包模拟私有属性和方法相关推荐

  1. js基础知识温习:Javascript中如何模拟私有方法

    本文涉及的主题虽然很基础,在很多人眼里属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题.这里会涉及到对象属性的封装.原型.构造函数.闭包以及立即执行表达式等知识. 公有方法 公有方法 ...

  2. python私有属性怎么定义_Python中定义私有属性的方法是()。

    [判断题]请假条带有请求的性质,所以一般来说篇幅要尽量长一些,以示郑重;更多要用煽情性语句,以打动对方.( ) [单选题]关于类和对象的关系,下列描述正确的是(). [选择]Трудоспособны ...

  3. javaScript中私有属性和方法

    javaScript并没有特殊的语法来表示私有.保护.或公共属性和方法,在这一点上与 java或其他语言是不同的,JavaScript中所有对象的成员是公用的: var myobj={ mypop:1 ...

  4. 私有属性和方法-通过父类方法间接访问

    class A:def __init__(self):self.num1 = 100self.__num2 = 200def __test(self):print("私有方法 %d %d&q ...

  5. 私有属性和方法-子类对象不能直接访问

    class A:def __init__(self):self.num1 = 100self.__num2 = 200def __test(self):print("私有方法 %d %d&q ...

  6. 私有属性和方法-伪私有属性和方法

    class Women:def __init__(self, name):self.name = nameself.__age = 18def __secret(self):# 在对象的方法内部,是可 ...

  7. 私有属性和方法-应用场景、定义方式和演练

    class Women:def __init__(self, name):self.name = nameself.__age = 18def __secret(self):# 在对象的方法内部,是可 ...

  8. Javascript 对象不支持此属性或方法,Object doesn’t support this property or method

    中文 Microsoft 对VBscript出现这种错误的解释 Visual Basic 参考:错误消息. 对象不支持此属性或方法(Visual Basic). 为此自动化对象指定的方法或属性不存在 ...

  9. C# 使用反射获取私有属性的方法

    本文告诉大家多个不同的方法使用反射获得私有属性,最后通过测试性能发现所有的方法的性能都差不多 在开始之前先添加一个测试的类 public class Foo{private string F { se ...

最新文章

  1. Linux下用户组、文件权限
  2. WinAPI: waveInGetNumDevs - 获取波形输入设备的数目
  3. C: Answers to “The C programming language, Edition 2”
  4. 数据库分页存储过程(4)
  5. 《计算机网络-自顶向下方法》之什么是因特网?
  6. 使用IDEA运行Spark程序
  7. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task3:网络模型结构发展
  8. trietree的一个小练习
  9. 关于$.getJson
  10. arm linux漏洞,GitHub - armjirawat/linux-kernel-exploits: linux-kernel-exploits Linux平台提权漏洞集合...
  11. CentOS 下重装 jdk
  12. svn up (svn update) 状态缩写含义
  13. linux查看redis没有权限,在linux上安装redis并设置权限
  14. R语言模拟:Bias Variance Decomposition
  15. 深度复盘 | 蚂蚁集团万级规模 k8s 集群基建之路
  16. Educational Codeforces Round 20 C. Maximal GCD
  17. 网吧游戏更新对比软件技术报告
  18. 【技术】怎么将PPT中的白底图片,白色部分变透明?
  19. 数字政府智慧政务一网通办解决方案2022
  20. 单细胞论文记录(part7)--DL and alignment of spatially resolved single-cell transcriptomes with Tangram

热门文章

  1. github的python代码怎么跑_如何利用Python模拟GitHub登录详解
  2. 调参方法论:如何提高机器学习模型的性能?
  3. Pytorch开发环境安装(Windows版本)
  4. Gamma函数(伽玛函数)的一阶导数、二阶导数公式推导及java程序
  5. 网络爬虫ip代理服务器【程序样例】
  6. 消息中间件的技术选型心得-RabbitMQ ActiveMQ和ZeroMQ
  7. Golang的数组与切片——详解
  8. IntelliJ IDEA常用快捷键——基于Eclipse
  9. js计算器代码加减乘除_理不清亲戚关系,程序员直接写了一个亲戚关系计算器,来试试?...
  10. 计算机教育类会议论文,中国教育和科研网(CERNET)第七届学术会议征集论文通知...