JS学习笔记-OO疑问之封装
封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装。封装实现、封装变量,提高数据、系统安全性,封装正是面向对象的基础。
一、匿名函数
即没有名字的函数,其创建方式为
function(){...}
单独存在的匿名函数,无法执行,可通过赋值给变量调用或通过表达式自我执行来实现执行。
1.赋值给变量为一般的函数使用方式
var run = function(){
return '方法执行中';
};
alert(run());
2.通过表达式自我运行
(function(arguments可选)
{
alert('方法执行中');
})(arguments);
二、闭包
在一个普通函数的内部,创建一个匿名函数,匿名函数可訪问普通函数中的变量,进而实现类似于面向对象中封装的特性,这个匿名函数就叫做相应普通函数的闭包。闭包就是对外创建的接口,通过接口达到訪问函数内部变量的效果。
functionrun()
 {
var username
 = 'Forrest';
return function () { //通过匿名函数返回 box()局部变量
return username;
};
}
//alert(username);                 
 //错误username is
 not defined
alert(run()());
特点:闭包中使用的局部变量会驻留在内存中,避免了使用全局变量造成的命名冲突等情况的发生。值得注意的是闭包中使用thiskeyword,指向的是window对象。
三、封装
为了更好的安全性、数据保护,则须要对数据进行私有化的封装,而JS中没有块级作用域的概念(即出了{}的范围,仍能够訪问声明的变量),但有了前面的基础,我们就能够达到像其它正规面向对象语言的封装效果。
 function user(){
	 (function(){
		 for(i = 0; i<5; i++){
			 alert(i);
		 }
	 })();
	 alert(i);                          //此处无法訪问变量i
 }
 //私有作用域取代全局变量
 (function(){
	 var username= 'Forrest';
	 alert(username);
})();                                  //匿名函数运行完成后,变量马上销毁
 //訪问私有变量
 function User(){
	var username= Forrest;            //私有变量
	function learn(){                 //私有函数
		 return '学习中';
	 };
	 //对外提供接口,间接訪问内部成员
	 this.userlearn = function(){
		 return username + learn();
	 };
 }
 var user = new User()
 alert(user.userlearn());
 //实现get()、set()
 function User(value){
	 var user = value;
	 this.getUser = function(){
		 return user;
	 }
	 this.setUser = function(value){
		 user = value;
	 }
 }
 var user = new User('Forrest');
 alert(user.getUser());
 user.setUser('Li');
 alert(user.getUser());
 //静态私有变量
 (function(){
	 var user = '';
	 User = function(value){
		 user = value;
	 };
	 User.prototype.getUser = function(){
		 return user;
	 };
	 User.prototype.setUser = function(value){
		 user = value;
	 };
 })();
 //字面量方式的私有化
 function NormalUser(){}
 var user = function(){
	 var user = 'Forrest';
	 function learn(){
		 return user + '学习中...';
	 };
	 var nu = new NormalUser();
	 nu.userlearn = function(){
		 return learn();
	 };
	 return nu;
 }();
 alert(user.userlearn());
结语:
JS虽不是一门正统的面向对象的语言,但用它也能达到面向对象的封装、继承、多态等的效果,学习起来还是须要好好理解的,特别是对于使用JS不是特别多的人来说,仅仅能等到以后的逐步应用来解决这一系列的问题,更进一步体会它在面向对象方面的应用。
JS学习笔记-OO疑问之封装的更多相关文章
- JS学习笔记-OO疑问之对象创建
		
问一.引入工厂,解决反复代码 前面已经提到,JS中创建对象的方法,不难发现,主要的创建方法中,创建一个对象还算简单,假设创建多个类似的对象的话就会产生大量反复的代码. 解决:工厂模式方法(加入一个专门 ...
 - JS学习笔记-OO创建怀疑的对象
		
问了.工厂介绍,解决重码 前面已经提到,JS中创建对象的方法.不难发现,主要的创建方法中,创建一个对象还算简单,假设创建多个类似的对象的话就会产生大量反复的代码. 解决:工厂模式方法(加入一个专门创建 ...
 - WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)
		
WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...
 - WebGL three.js学习笔记 创建three.js代码的基本框架
		
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
 - js学习笔记:webpack基础入门(一)
		
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
 - Vue.js学习笔记(2)vue-router
		
vue中vue-router的使用:
 - JS 学习笔记--9---变量-作用域-内存相关
		
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
 - WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法
		
WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...
 - vue.js 学习笔记3——TypeScript
		
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
 
随机推荐
- 让你提前知道软件开发(22):shell脚本文件操作
			
文章1部分 再了解C语言 shell脚本中的文件操作 [文章摘要] 编写shell脚本时,经常会涉及到对文件的操作,比方从文件里读取一行数据.向文件追加一行数据等. 完毕文件读写操作的方法有非常多,了 ...
 - Unigine 基础入门
			
1. 首先要搭建好开发环境: 1)Visual Stodio 已经安装了. 2). Microsoft Windows SDK 7.1 (for Windows 7): https://www.mic ...
 - Copy xml 文件
			
public static void copyFailFile(String bugID) throws Exception { File file = new File(".") ...
 - android--手机桌面添加网址链接图标(解决方式)
			
这样的做法最普遍最简单: 1.新建一个android空项目: 2.在drawable文件夹下加入图标文件,如icon.png:在values文件夹下的strings.xml文件里添加名称.如websi ...
 - Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单
			
原文:Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单 长长的列表文字类型文件 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 214 ...
 - C++ Primer 学习笔记_61_重载操作符与转换  --自增/自减操作符
			
重载操作符与转换 --自增/自减操作符 引言: 自增,自减操作符常常由诸如迭代器这种类实现,这种类提供相似于指针的行为来訪问序列中的元素.比如,能够定义一个类,该类指向一个数组并为该数组中的元素提供訪 ...
 - Application to find the maximum temperature in the weather dataset
			
import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop. ...
 - 关于IE打印预览内容显示不全的问题解决
			
眼下在调整一个页面打印功能的时候,发现多行文本框TextArea在页面显示的时候,多行文本能够正常显示,可是在打印页面的时候.部分内容就被遮挡住了, 苦思冥想不得其解,后来还是请教了美工. 首先查了下 ...
 - 命令行參数选项处理:getopt()及getopt_long()函数使用
			
在执行某个程序的时候,我们通常使用命令行參数来进行配置其行为.命令行选项和參数控制 UNIX 程序,告知它们怎样动作. 当 gcc的程序启动代码调用我们的入口函数 main(int argc ...
 - SWT的CheckBoxTreeView的上级菜单与下级菜单的选中的实现
			
是不是很神奇? treeViewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStat ...