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 ...
随机推荐
- iOS学习——JSON数据解析(十一)
在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...
- 《Java程序代理器》- java桌面程序运行的前端启动框架
虽说让java直接在桌面运行,有很多方法,但最简单的还是有个exe双击执行 要java执行就得有虚拟机,但原本的虚拟机文件体积太大,不方便随同打包,精简的虚拟机功能又不全,指不定什么时候报错 所以正规 ...
- hive字符串函数
1. 字符串长度函数:length 语法: length(string A) 返回值: int 说明:返回字符串A的长度 举例: hive> select length('abcedfg') f ...
- mongodb在PHP下的应用学习笔记
1.连接 mongodb默认端口是:27017,因此我们连接mongodb:$mongodb = new Mongo('localhost') 或者指定IP与端口 $mongodb = new Mon ...
- 通过Camera进行拍照
Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可: 下面用一个示例来演示: Activity: package com.home.activity; import j ...
- cocos2dx 制作单机麻将(一)
今天開始打算解说下cocos2dx下怎样制作国标麻将 前半部分先解说麻将的逻辑部分,由于都是代码,可能会比較枯燥无聊. 这部分讲完后,你也能够用其它游戏引擎来制作麻将 后半部分,就解说余下的cocos ...
- 【Energy Big Data】能源互联网和电力大数据
背景 今年的政府工作报告突出了互联网在经济结构转型中的重要地位,报告明白指出:要制定"互联网+"行动计划,推动移动互联网.云计算.大数据.物联网等与现代制造业结合,促进电子商务.工 ...
- Android Studio使用心得 - 简单介绍与环境配置
FBI Warning:欢迎转载,但请标明出处:http://blog.csdn.net/codezjx/article/details/38544823,未经本人允许请勿用于商业用途.感谢支持! 关 ...
- 开放源代码的微微信.NET 0.8 版公布了
微微信.NET 0.8 版公布了 A.源代码应用范围: 未认证的和经过认证的微信订阅号.微信服务号均可使用,本源代码的每个模块都提供全然的 ASP.NET C#源代码,绝对不含 ...
- android "Missing type parameter" 错误
近期在做android应该的时候出现这个问题,分析了一下日志,发现是在gosn解析的时候会出现,并且出现的时候非常诡异.于是去网上找相关资料. 发现这个问题还是比較常见的,原来是公布版本号和非正式公布 ...