计划和完成这个例子中,音符的顺序如下:

  1. Java程序猿的JavaScript学习笔记(1——理念)
  2. Java程序猿的JavaScript学习笔记(2——属性复制和继承)
  3. Java程序猿的JavaScript学习笔记(3——this/call/apply)
  4. Java程序猿的JavaScript学习笔记(4——this/闭包/getter/setter)
  5. Java程序猿的JavaScript学习笔记(5——prototype)
  6. Java程序猿的JavaScript学习笔记(6——面向对象模拟)
  7. Java程序猿的JavaScript学习笔记(7——jQuery基本机制)
  8. Java程序猿的JavaScript学习笔记(8——jQuery选择器)
  9. Java程序猿的JavaScript学习笔记(9——jQuery工具方法)
  10. Java程序猿的JavaScript学习笔记(10——jQuery-在“类”层面扩展)
  11. Java程序猿的JavaScript学习笔记(11——jQuery-在“对象”层面扩展)
  12. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
  13. Java程序猿的JavaScript学习笔记(13——jQuery UI)
  14. Java程序猿的JavaScript学习笔记(14——扩展jQuery UI)

这是笔记的第4篇,聊聊闭包/getter/setter。看看JavaScript中的变量作用域和实现封装的方法。

作者博客:http://blog.csdn.net/stationxp

作者微博:http://weibo.com/liuhailong2008

转载请取得作者允许

1、闭包

闭包是JavaScript一项简单有用的语言特性。通过闭包:
弥补了函数没有public/private等訪问訪问权限控制符的缺陷。保护了函数内部变量的安全。

使得函数对象在作为參数传递时,不只传递运算逻辑,同一时候也传递了相关变量。

使得函数“类”的不同实例。独享自己的属性。
以下逐个来看。

1.1、保护私有变量

1.1.1、原理

闭包最基本的特性是:当函数作为返回值时,连同函数定义时的环境(包含函数外部,函数能够訪问到的变量)一起返回,确保这些变量不因其依附的对象销毁而被销毁。
有点儿绕,详细什么意思呢?看以下的代码:
// 代码段1
 function UiObject() {
     var childCount = 0; // 函数内部变量,  
     return 0;
 }
 
 var funcReturnValue = UiObject();  // 调用函数,返回0
 console.log(UiObject.childCount);   // 输出:undefined,因为函数调用完毕。内部变量已经被销毁
 
 childCount随着UiObject函数的调用结束而销毁,从还有一个角度看。保护了函数内部的变量。
 在这个基础上,假设我们有一种办法能够确保函数的内部变量不被销毁。并且提供方法对其訪问操作。也就实现了通过public方法訪问 private 变量。

代码例如以下:
 // 代码段2
 function UiObject() {
     var childCount = 0; // 函数内部变量
     function getChildCount(){
         childCount = 6;
         return childCount;
     }
     return getChildCount;
 }
 var funcReturnFObject = UiObject();  // 调用函数,返回 getChildCount 函数,返回值是一个闭包
 console.log(funcReturnFObject());   // 输出:6
 以下我们就看看,假设利用闭包的这一特性实现对私有属性的保护。

1.1.2、语法

在代码段2的基础上改进,代码段3展示的代码。能够同一时候提供多个方法,对私有属性訪问。
 //代码段3
 function UiObject() {
     var childCount = 0; // 函数内部变量
     
     return {
         getChildCount : function (){
             return childCount;
         },
         setChildCount : function (cnt){
             childCount = cnt;
         }
     };
 }
 
 var o = UiObject();  // 调用函数,返回 getChildCount 函数,返回值是一个闭包
 o.setChildCount(6);
 console.log(o.getChildCount());   // 输出:6
 
 思考: 假设 var childCount = 0 ; 改为 this.childCount = 0; 呢?
 我们之前研究过this,“ this.childCount = 0; ”语句是将childCount附加为调用者的属性,this.childCount的将生命周期与调用者同样。

这与闭包不冲突。
 
 代码段3还能够写成代码段4的形式。

// 代码段4
 function UiObject() {
     var childCount =  0; // 函数内部变量
     this.setChildCount = function(cnt){
         childCount = cnt;
     };
     this.getChildCount = function(){
         return childCount;
     };
 }
 
 var ui = new  UiObject();          // 调用函数,返回retObj
 console.log(ui.childCount);       // 输出:undefined,因为函数调用完毕,局部变量已经被销毁
 ui.setChildCount(3);                  // 因为闭包的作用。ui仍然保存着变量childCount,并对其操作
 console.log(ui.getChildCount()); // 输出:3
 
 “this.setChildCount = function(cnt){       childCount = cnt;   };” 这个语句相当于在UiObject内部定义了函数并“传递”了给ui对象。相同产生了闭包。

1.2、传递函数时。同一时候传递上下文

通过上面的样例,我们已经看到了这点特性。
在详细的应用场景中可对其大加利用。

1.3、不同实例,独享自己的变量

我们已经知道了。函数在传递过程中,会产生一个闭包。对于同一方法产生的闭包,是同样的,还是为每次传递创建了不同的拷贝呢?
看以下的代码:
//代码段5
 function UiObject() {
     var childCount = 0; // 函数内部变量
     
     return {
         getChildCount : function (){
             return childCount;
         },
         setChildCount : function (cnt){
             childCount = cnt;
         }
     };
 }
 
 var ui1 = UiObject();
 var ui2 = UiObject();
 
 ui1.setChildCount(1);
 ui2.setChildCount(2);
 
 console.log(ui1.getChildCount()); // output : 1
 console.log(ui2.getChildCount()); // output : 2
 
 每次生成闭包是不同的拷贝。
 
 思考:对照Java。加深理解。

2、getter/setter

JavaScript
 //代码段6
 var uiPanel ={
     _type  : 'Panel',
     _width : -1,
     _height: -1,
     
     get type(){ return this._type;},
     
     get width(){ return this._width; },
     set width(v){this._width = v;},
     
     get height(){ return this._height; },
     set height(v){this._height = v;}
 };
 
uiPanel.type = 'TextField';          // does not work
console.log('type:'+uiPanel.type); // ouput :         type:Panel
 
 uiPanel.width = 800;                 //
 console.log('width:'+uiPanel.width); // ouput :         width:800

语法上越发有面向对象的范儿了。
除了在定义时通过set/setkeyword控制属性的读写权限。还能够在执行期通过 Object.defineProperty()函数动态加入属性。并提供更精细的控制。

代码例如以下(下面代码均未经实验):
var o = {};
Object.defineProperty(o,'propName',{
            value:1,  //属性的值,也能够通过   get:function(){retun x。}的方法设定
            writeable:true,//能否够通过o.propName  = newValue ; 的方法设置属性的值
            enumerable:false,//能否够通过被枚举
            configurable:true//能否够通过defineProperty配置
    });
另外,另一系列API能够完毕对属性的配置、检測。例如以下:
Object.getOwnPropertyDescriptor{{x:1},"x"}
Object.keys(obj);    // 获得对象上全部可枚举的“实例属性”
Object.getOwnPropertyNames(obj) ;//获得对象上全部的“实例属性”
obj.hasOwnProperty(‘id’); //仅仅要该对象obj拥有属性id, 不管id是否可枚举,都返回true

3、小结

当大多数人已经习惯了面向对象的思维和方法,语言就要从特性方面予以满足。这不合理,也不美。但世界就是如此不完美。

JavsScript天生丽质。非要把她改造成机甲战士,那以后谁来负责倾国倾城呢?

ECMAScript 5不是革命性创新,也不是救命稻草。这个世界本来能够更好的。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Java程序猿JavaScript学习笔记(4——关闭/getter/setter)相关推荐

  1. Java程序猿搬砖笔记(七)

    文章目录 Java导入1W条数据耗时超过100秒 Java正则表达式的几种实现方式 Linux查询进程杀进程命令 spring 注解@primary解析 @resource可以和@Qualifier有 ...

  2. java程序伪代码_Java学习笔记——伪代码及程序控制

    开学刚刚一个月,学习Java也已经有三周. 老师给了下面的实验题目: 某教师需要一个学生成绩计算应用程序.每个学生总评成绩是由平时成绩.期中成绩.期末成绩 和其它成绩组成,其所占比例为:平时成绩30% ...

  3. Java程序猿搬砖笔记(九)

    文章目录 ZipOutputStream打包文件成一个zip,自定义写入文件夹和文件 Get请求且用?号形式传参,那么list参数必须加@RequestParam主键否则会报错 Java7文件复制方法 ...

  4. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  6. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. java程序猿必读的学习书籍,良心推荐!

    每年都有很多人想要学习java技术,有的是自学,有的是报班学习,但是都免不了要看书籍学习,书籍学习带来的知识更加牢记,也可以随时做笔记,下面小编就为大家推荐java程序猿必读的学习书籍,希望能帮助到大 ...

  8. 正则至少一个数字_好程序员web前端培训分享JavaScript学习笔记之正则

    好程序员web前端培训分享JavaScript学习笔记之正则,正则表达式,又名 "规则表达式" 由我们自己来书写 "规则",专门用来检测 字符串 是否符合 &q ...

  9. 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议 - 左潇龙 - 博客园...

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

最新文章

  1. 5G边缘计算与算力网络(PPT)
  2. BUUCTF-[网鼎杯 2020 青龙组]singal——angr学习记录
  3. Linux命令在线查询
  4. 理解spark闭包以及broadcast(转载)
  5. container_of实例
  6. 【计算机网络复习 数据链路层】3.5.3 CSMA协议
  7. 文档大小超出上传限制怎么办_一键PDF转Word、PPT、图片等文档,这才是办公族必备的效率神器!...
  8. 中国互联网关于阿里未来预测:这盘大期如何走
  9. css img 适配尺寸_CSS——img标签图片适配居中问题
  10. Atitit 常用数据类型有哪些 目录 1.1. 数值类型 整数 小数 自增整数 1 1.2. 货币类型 1 1.3. 字符类型 字符串 2 1.4. 日期/时间类型 时间戳 2 1.5. Ur
  11. 2、Kmeans算法处理出租车数据
  12. imdisk虚拟光驱装linux,怎么样通过虚拟光驱装Ubuntu系统?
  13. PHP有哪些基本数据类,PHP的基本数据类型
  14. 花木兰替父从军java_花木兰替父从军 木兰诗原文
  15. 正则表达式实现与或非
  16. Sara 老友记 第一季第六集 Joey天天演烂片
  17. 未分配虚拟网络-清理注册表
  18. linux搭建kubernetes集群(一主二从)
  19. Handler消息机制介绍,流程梳理
  20. 得链表者得天下(中)

热门文章

  1. 如何搭建私密云存储之ownCloud
  2. pandas之数据结构
  3. poj 2371 Questions and answers
  4. 【转】蓝牙技术及其系统原理
  5. 【Mood 16 】史上最全github使用方法:github入门到精通
  6. 数据查询(1)-简单查询(芮)
  7. 在ASP.NET MVC中使用DropDownList
  8. 在VMWare上安装Win3.2
  9. 学java需要什么基础_学java需要什么基础?
  10. 中科院分区 2020_2020中科院期刊分区出炉!文末附2020年中科院期刊分区基础版(全)...