私有变量

严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的。

但是JS中有私有变量的概念

所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问

私有变量包括

1.函数参数

2.局部变量

3.函数内部定义的其他函数

还有一个概念叫 特权方法

特权方法指的就是有权能够访问私有变量的方法

私有变量和特权方法主要用来隐藏不应该被直接修改的数据

function Person(name){
this.getName = function(){
return name;
}
this.setName = function(newName){
name = newName;
}
}

比如上述构造函数,在创建对象传入一个 name

而这个 name  只能通过每个对象的两个方法进行访问和修改

有些时候比如一个特殊的对象,每次对它某个属性值的操作只能加一和减一

这种情况下,如果我们将这个值不作为私有变量,所有情况都能访问,那么它被意外修改的可能性就很高了

这就是JS中私有变量的主要作用

静态私有变量

上面的方法我们创建了一个私有变量 name

但是通过该构造函数构造的每个实例的 name 都是独立的

如果我们希望像其他的语言那样创建一个所有实例共用的私有变量怎么办呢?

(function(){
// 私有变量
var privateValue = 10;
var privateMethod = function(){
return false;
} // 构造函数
Public = function(){}; // 公有方法
Public.prototype.publicMethod(){
private++;
return privateMethod();
}
}

上方的代码在一个自执行的函数中,创建了两个私有变量和一个构造函数

由于我们没有使用 var 进行声明,所以 Public 会默认添加到全局作用域(当然这种方法在严格模式下无法使用)

然后我们给这个构造函数的原型添加了一个公有方法

由于这个公有方法是自执行函数的闭包,所以可以访问到我们之前创建的私有变量

并且因为我们将这个公有方法添加在这个构造函数的原型上,所以这个构造函数的所有实例,都使用的这个公有方法

自然访问到的私有变量也是同一个

模块模式

前面的内容主要是为自定义对象创建私有变量的

那么模块模式又是什么意思呢?

模块模式指的就是为单例创建私有变量和特权方法

所谓单例就是只有一个实例对象

按照惯例,JS中创建单例一般都是用字面量的形式来创建的

模块模式如下:

var singleton = function(){
// 创建私有变量
var privateValue = 10;
return {
getValue:function(){
return privateValue;
}
}
}();

这种模式适用于,当需要对对象进行初始化,并且需要公开一些访问私有变量的公共方法,就可以使用模块模式

增强模块模式

刚才的模块模式存在一个问题

那就是无法判断生成单例的类型,一般来说也用不着判断一个单例的类型

但难免有些情况需要让单例是某个类型的实例

所以就有了增强模块模式

var singleton = function(){
var privateValue = 10;
var object = new CustomType(); //添加特权
object.publicMethod = function(){
privateValue++;
return privateValue;
} return object;
}();

以上就是和函数表达式相关的内容啦,明天开始更BOM

Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量的更多相关文章

  1. Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域

    昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...

  2. Javascript高级编程学习笔记(23)—— 函数表达式(1)递归

    前面的文章中,我在介绍JS中引用类型的时候提过,JS中函数有两种定义方式 第一种是声明函数,即使用function关键字来声明 第二种就是使用函数表达式,将函数以表达式的形式赋值给一个变量,这个变量就 ...

  3. Javascript高级编程学习笔记(24)—— 函数表达式(2)闭包

    昨天的文章中主要记录了,函数表达式与函数声明的区别 以及在JS中如何安全地使用递归 那么既然要深入地理解JS中的函数,闭包就是一个绕不开的概念 闭包 JS高编一书中对闭包的概念定义如下: 闭包是指有权 ...

  4. 《JavaScript高级程序设计》笔记:函数表达式(七)

    递归 function factorial(num){ if(num<=1){ return 1; }else { return num * arguments.callee(num-1); } ...

  5. Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型

    JS中许多有趣的地方都和函数脱不了联系 那么是什么让JS中的函数这么有趣呢? 我们一起来看看吧 Function类型 在JS中函数实际上就是对象,每个函数都是Function类型的实例,和JS的其他引 ...

  6. Javascript高级编程学习笔记(9)—— 执行环境

    今天主要讲一下,JS底层的一些东西,这些东西不太好举例(应该是我水平不够) 望大家多多海涵,比心心 执行环境 执行环境(执行上下文,全文使用执行环境 )是JS中最为重要的一个概念,执行环境决定了,变量 ...

  7. Javascript高级编程学习笔记(7)—— 函数

    前几天有事耽搁了,今天继续更新 今天的主要内容是JS中的函数 这一篇主要讲函数的定义等内容,至于变量提升.执行环境.闭包.内存回收等内容在后面讲,高玩们可以不用看下面的正文了. 函数 首先来讲,函数对 ...

  8. JavaScript高级编程学习笔记(第三章之一)

    继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...

  9. Javascript高级编程学习笔记(6)—— 流程控制语句

    话不多说,我们直接开始进入今天的主题 流程控制语句 首先什么是流程控制语句呢? 顾名思义,就是控制流程的语句. 在JS中语句定义了ECMAScript中的主要语法,让我们可以使用一系列的关键字来完成指 ...

随机推荐

  1. js/jquery遇到的坑总结

    1.“removeAttribute is not a function” error message 原因以及解决方法:removeAttribute is a JavaScript DOM fun ...

  2. Spring Scheduled定时任务报错 java.lang.IllegalStateException: Encountered invalid @Scheduled method 'xxx': For input string: "2S"

    报错信息如下: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ding ...

  3. python爬虫工具集合

    python爬虫工具集合 大家一起来整理吧!强烈建议PR.这是初稿,总是有很多问题,而且考虑不全面,希望大家支持! 源文件 主要针对python3 常用库 urllib Urllib是python提供 ...

  4. 如何将一个excel表格的数据匹配到另一个表中

    我们在操作excel表的时,有时需要将一个excel表中的数据匹配到另一个表中,那么就需要用到VLOOKUP函数,VLOOKUP函数是Excel中的一个纵向查找函数,VLOOKUP是按列查找,最终返回 ...

  5. 服务管理之rsync

    目录 rsync 1. rsync简介 2. rsync特性 4. rsync命令 5. rsync+inotify rsync 1. rsync简介 rsync是linux系统下的数据镜像备份工具. ...

  6. SpringBoot对注册用户密码进行Bcrypt密码加密

    一.注册用户时,用户的密码一般都是加密存储在数据库中.今天我要用到的加密方式是Bcrypt加密. 1.首先在SpringBoot项目的pom文件中,引入SpringSecurity相关依赖,目的是为了 ...

  7. 关于微信小程序切换获取不到元素的问题

    1.由于公司要实现微信小程序的自动化,所以开始学习python + appium 实现微信小程序自动化.在学习过程中遇到在切换webview后获取不到页面元素的问题,导致无法继续.今天在网上看到一篇关 ...

  8. Python中logging日志模块的使用

    参考https://www.cnblogs.com/CJOKER/p/8295272.html

  9. Unity3D 在Update中不要过多地修改Transform 信息

    前文说到碰撞检测时候,不要在Update内部尝试移动GameObject 来检查碰撞检测,这样是徒劳无功.但是 说到 因为你移动的过程中其实并没有将实际的移动位置更新到物理引擎,只是做了个缓存而已, ...

  10. 数组,arrayList和List

    数组,arrayList和List (1)数组在C#中是最早出现的.它在内存中是连续的存储的,所以索引速度很快,而且赋值与修改元素也很简单.可以利用偏移地址访问元素,时间复杂度为O(1);可以用折半查 ...