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 ...
随机推荐
- android画笔错位问题的解决
下面的画画板的代码: public class MainActivity extends Activity { private ImageView iv; private Bitmap baseBit ...
- (ZT)LoadRunner9.0成功破解方法
LoadRunner9.0软件下载地址: http://www.3atesting.com/filedown/LR9Download.exe 破解所需文件 http://download.csdn.n ...
- 基于HTTP和TFTP的PXE批量自动化安装Linux系统
CentOS 6.5 PXE自动化部署系统 拓扑图如下: 步骤: 1. 安装http服务,上传ISO文件 [root@UCS-1 ~]# yum install httpd –y [root@UCS ...
- hdu1054(最小顶点覆盖)
传送门:Strategic Game 题意:用尽量少的顶点来覆盖所有的边. 分析:最小顶点覆盖裸题,最小顶点覆盖=最大匹配数(双向图)/2. #include <cstdio> #incl ...
- POJ 3458 Colour Sequence(简单题)
[题意简述]:事实上题意我也没有特别看懂.可是依据它少许的题目描写叙述加上给的例子.就大胆的做了例如以下的推測: 就是说,如今给出一串字符s.然后紧接着给出可见的字符串visible还有隐藏的字符串h ...
- Python数据结构-序表
序表解包: list=['aa','bb','cc'] [a1,a2,a3]=list
- CentOS修改yum更新源
1. 在修改前先备份该文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2. 修改更新源配置文 ...
- php-GD库的函数(二)
<?php //imagecopy — 拷贝图像的一部分粘贴到某图像上 /*bool imagecopy ( resource $dst_im , resource $src_im , int ...
- Java 实现二分(折半)插入排序
设有一个序列a[0],a[1]...a[n];当中a[i-1]前是已经有序的,当插入时a[i]时,利用二分法搜索a[i]插入的位置 效率:O(N^2),对于初始基本有序的序列,效率上不如直接插入排序: ...
- Linux cp -a用法
对于cp -a最主要的用法是在保留原文件属性的前提下复制文件.其实还有个很好的用法,如下: 大家知道linux下复制目录可以通过,cp -r dirname destdir 但是这样复制的目录属性会发 ...