Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下:
- Java程序猿的JavaScript学习笔记(1——理念)
- Java程序猿的JavaScript学习笔记(2——属性复制和继承)
- Java程序猿的JavaScript学习笔记(3——this/call/apply)
- Java程序猿的JavaScript学习笔记(4——this/闭包/getter/setter)
- Java程序猿的JavaScript学习笔记(5——prototype)
- Java程序猿的JavaScript学习笔记(6——面向对象模拟)
- Java程序猿的JavaScript学习笔记(7——jQuery基本机制)
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
- Java程序猿的JavaScript学习笔记(9——jQuery工具方法)
- Java程序猿的JavaScript学习笔记(10——jQuery-在“类”层面扩展)
- Java程序猿的JavaScript学习笔记(11——jQuery-在“对象”层面扩展)
- Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
- Java程序猿的JavaScript学习笔记(13——jQuery UI)
- 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)的更多相关文章
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(3——this/call/apply)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(1——理念)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
随机推荐
- hdu3966(树链剖分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意:一颗树上,每个点有权值,定义三种操作: 1)I操作表示从a到b节点之间的节点都加上一个值 ...
- auto_ptr and scoped_ptr
#include "boost/scoped_ptr.hpp" #include <iostream> #include <memory>//contain ...
- Android中Broadcast Receiver组件具体解释
BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播 ...
- hdu1874畅通工程续 (dijkstra)
Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行 ...
- Android它Service
服务是一段代码的后台执行. 无法处理,也不是螺纹,但它是在进程和线程的执行. Android该服务与Activity不同,不能与用户交互,无法启动自己. 媒体播放服务.当用户退出媒体选择用户界面,不过 ...
- 项目之软件project(我专业四年都未曾知道这四个字的含义,几句话便懂了)
潘鹏在CSDN上原创.如其它站点转载请注意排版和写明出处: 软件project的本质 一级标题 控制 质量 二级标题 成本 扩展 高内聚低耦合 效率 控制: 成本:企业要求的是以最快的速度完毕可 ...
- sharepoint 2013 userprofile 用户信息
Sharepoint2013获得当前用户userfrofile 基本介绍: 什么使用户配置文件. 用户属性和用户配置文件属性提供有关 SharePoint 用户的信息,如显示名称.电子邮件.标题以及其 ...
- pygame系列_游戏中的事件
先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...
- Uva11464 开关问题
给一个n×n的01矩阵,你的任务是将尽量少的0变成1,是的每个元素的上下左右的位置(如果存在的话)的之和均为偶数.1<=n<=15. 如果暴力整个矩阵,那么时间复杂度是O(2^(n*n)) ...
- Windows 8 应用开发 - 本地数据存储
原文:Windows 8 应用开发 - 本地数据存储 在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下 ...