Javascript 进阶 封装
js中处处是对象,面向对象的第一步当然就是封装了,由于Js中没有类的概念,所以封装起来也比较麻烦,下面介绍两种js的封装。
1、使用约定优先的原则,将所有的私有变量以_开头
- <script type="text/javascript">
- /**
- * 使用约定优先的原则,把所有的私有变量都使用_开头
- */
- var Person = function (no, name, age)
- {
- this.setNo(no);
- this.setName(name);
- this.setAge(age);
- }
- Person.prototype = {
- constructor: Person,
- checkNo: function (no)
- {
- if (!no.constructor == "string" || no.length != 4)
- throw new Error("学号必须为4位");
- },
- setNo: function (no)
- {
- this.checkNo(no);
- this._no = no;
- }, getNo: function ()
- {
- return this._no;
- }, setName: function (name)
- {
- this._name = name;
- }, getName: function ()
- {
- return this._name;
- }, setAge: function (age)
- {
- this._age = age;
- }, getAge: function ()
- {
- return this._age;
- }, toString: function ()
- {
- return "no = " + this._no + " , name = " + this._name + " , age = " + this._age;
- }
- };
- var p1 = new Person("0001", "鸿洋", "22");
- console.log(p1.toString()); //no = 0001 , name = 鸿洋 , age = 22
- p1.setNo("0003");
- console.log(p1.toString()); //no = 0003 , name = 鸿洋 , age = 22
- p1.no = "0004";
- p1._no = "0004";
- console.log(p1.toString()); //no = 0004 , name = 鸿洋 , age = 22
- </script>
看完代码,是不是有种被坑的感觉,仅仅把所有的变量以_开头,其实还是可以直接访问的,这能叫封装么,当然了,说了是约定优先嘛,这种方式还是不错 的,最起码成员变量的getter,setter方法都是prototype中,并非存在对象中,总体来说还是个不错的选择。如果你觉得,这不行,必须严 格实现封装,那么看第二种方式。
2、严格实现封装
- <script type="text/javascript">
- /**
- * 使用这种方式虽然可以严格实现封装,但是带来的问题是get和set方法都不能存储在prototype中,都是存储在对象中的
- * 这样无形中就增加了开销
- */
- var Person = function (no, name, age)
- {
- var _no , _name, _age ;
- var checkNo = function (no)
- {
- if (!no.constructor == "string" || no.length != 4)
- throw new Error("学号必须为4位");
- };
- this.setNo = function (no)
- {
- checkNo(no);
- _no = no;
- };
- this.getNo = function ()
- {
- return _no;
- }
- this.setName = function (name)
- {
- _name = name;
- }
- this.getName = function ()
- {
- return _name;
- }
- this.setAge = function (age)
- {
- _age = age;
- }
- this.
- getAge = function ()
- {
- return _age;
- }
- this.setNo(no);
- this.setName(name);
- this.setAge(age);
- }
- Person.prototype = {
- constructor: Person,
- toString: function ()
- {
- return "no = " + this.getNo() + " , name = " + this.getName() + " , age = " + this.getAge();
- }
- }
- ;
- var p1 = new Person("0001", "鸿洋", "22");
- console.log(p1.toString()); //no = 0001 , name = 鸿洋 , age = 22
- p1.setNo("0003");
- console.log(p1.toString()); //no = 0003 , name = 鸿洋 , age = 22
- p1.no = "0004";
- console.log(p1.toString()); //no = 0003 , name = 鸿洋 , age = 22
- </script>
看上面的代码,去掉了this.属性名,严格的实现了封装,只能通过getter,setter访问成员变量了,但是存在一个问题,所有的方法都存在对象中,增加了内存的开销。
3、以闭包的方式封装
- <script type="text/javascript">
- /**
- * 使用这种方式虽然可以严格实现封装,但是带来的问题是get和set方法都不能存储在prototype中,都是存储在对象中的
- * 这样无形中就增加了开销
- */
- var Person = (function ()
- {
- var checkNo = function (no)
- {
- if (!no.constructor == "string" || no.length != 4)
- throw new Error("学号必须为4位");
- };
- //共享变量
- var times = 0;
- return function (no, name, age)
- {
- console.log(times++); // 0 ,1 , 2
- var no , name , age;
- this.setNo = function (no)
- {
- checkNo(no);
- this._no = no;
- };
- this.getNo = function ()
- {
- return this._no;
- }
- this.setName = function (name)
- {
- this._name = name;
- }
- this.getName = function ()
- {
- return this._name;
- }
- this.setAge = function (age)
- {
- this._age = age;
- }
- this.
- getAge = function ()
- {
- return this._age;
- }
- this.setNo(no);
- this.setName(name);
- this.setAge(age);
- }
- })();
- Person.prototype = {
- constructor: Person,
- toString: function ()
- {
- return "no = " + this._no + " , name = " + this._name + " , age = " + this._age;
- }
- }
- ;
- var p1 = new Person("0001", "鸿洋", "22");
- var p2 = new Person("0002", "abc", "23");
- var p3 = new Person("0003", "aobama", "24");
- console.log(p1.toString()); //no = 0001 , name = 鸿洋 , age = 22
- console.log(p2.toString()); //no = 0002 , name = abc , age = 23
- console.log(p3.toString()); //no = 0003 , name = aobama , age = 24
- </script>
上述代码,js引擎加载完后,会直接执行Student = 立即执行函数,然后此函数返回了一个子函数,这个子函数才是new
Student所调用的构造函数,又因为子函数中保持了对立即执行函数中checkNo(no)
,times的引用,(很明显的闭包)所以对于checkNo和times,是所有Student对象所共有的,创建3个对象后,times分别为
0,1,2 。这种方式的好处是,可以使Student中需要复用的方法和属性做到私有且对象间共享。
转载地址:http://blog.csdn.net/lmj623565791/article/details/25080573
Javascript 进阶 封装的更多相关文章
- JavaScript进阶(十一)JsJava2.0版本
JavaScript进阶(十一)JsJava2.0版本 2007年9月11日,JsJava团队发布了JsJava2.0版本,该版本不仅增加了许多新的类库,而且参照J2SE1.4,大量使用了类的继承和实 ...
- javascript进阶课程--第二章--对象
javascript进阶课程--第二章--对象 学习要点 理解面向对象的概念 掌握对象的创建方法 掌握继承的概念和实现方法 基本概念 对象究竟是什么?什么叫面向对象编程? 对象是从我们现实生活中抽象出 ...
- javascript进阶课程--第三章--匿名函数和闭包
javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...
- JavaScript进阶之高阶函数篇
JavaScript进阶之高阶函数篇 简介:欢迎大家来到woo爷说前端:今天给你们带来的是JavaScript进阶的知识,接下来的系列都是围绕着JavaScript进阶进行阐述:首先我们第一篇讲的是高 ...
- JavaScript进阶内容——jQuery
JavaScript进阶内容--jQuery 我们在前面的文章中已经掌握了JavaScript的全部内容,现在让我们了解一下JavaScript库 这篇文章主要是为了为大家大致讲解JavaScript ...
- 2016/11/17 周四 <javascript的封装简单示例>
这是一个简单的javascript代码封装的示例以及封装后的调用方法: var ticker={ n:0, add:function() { this.n++; }, show:function() ...
- #笔记#JavaScript进阶篇一
#JavaScript进阶篇 http://www.imooc.com/learn/10 #认识DOM #window对象 浏览器窗口可视区域监测—— 在不同浏览器(PC)都实用的 JavaScrip ...
- 4、JavaScript进阶篇①——基础语法
一.认识JS 你知道吗,Web前端开发师需要掌握什么技术?也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HTML+CSS创建一个漂亮的页面,但这还不够,它只是静态页面 ...
- JavaScript 进阶(一)JS的"多线程"
这个系列的文章名为“JavaScript 进阶”,内容涉及JS中容易忽略但是很有用的,偏JS底层的,以及复杂项目中的JS的实践.主要来源于我几年的开发过程中遇到的问题.小弟第一次写博客,写的不好的地方 ...
随机推荐
- Android图片异步加载的方法
很多时候,我们在加载大图片或者需要处理较多图像数据的时候,希望显示效果能好点,不至于因为图片解码耗时产生ANR等情况,不得不说异步加载是个不错的方法.说到异步加载,避免application出现ANR ...
- 百度SiteApp构建网站APP
现在很多个人网站和企业网站都是传统的Web方式,有没有想过个人/企业网站也能做成APP应用对外宣传呢?专门找人去开发Android和IOS上的APP又太贵,为了赶上移动互联网时髦,我以个人网站试做了一 ...
- zabbix 邮件告警配置
使用外部邮箱账号发送报警邮件设置 一.关闭sendmail或者postfix service sendmail stop #关闭 chkconfig sendmail off #禁止开机启动 serv ...
- X-UA-Compatible是什么
X-UA-Compatible是神马? X-UA-Compatible是IE8的一个专有<meta>属性,它告诉IE8采用何种IE版本去渲染网页,在html的<head>标签中 ...
- Python 2.7 学习笔记 模块和包
我们来考虑下如下几种场景: 1.编写一个python程序,如果程序比较简单,则可以把代码放到一个python文件中.但如果程序功能比较多,可能需要多个python文件来组织源代码.而这些文件之间的代码 ...
- 进入MFC讲坛的前言(四)
MFC的消息映射机制 MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快.为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息 ...
- 利用httpclient和多线程刷訪问量代码
缘起于玩唱吧,由于唱吧好友少,訪问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的訪问机制,准备用java的httpclient库来进行刷訪问量,想到动态IP反复使用就想到了用多线程 ...
- JSP两个动作(include,forward)
include动作 <div id="container"> <jsp:include page="HelloWorld.jsp" flush ...
- redis 消息队列(发布订阅)、持久化(RDB、AOF)、集群(cluster)
一:订阅: 192.168.10.205:6379> SUBSCRIBE test Reading messages... (press Ctrl-C to quit) 1) "sub ...
- iOS设计模式:观察者
摘自:http://www.cocoachina.com/applenews/devnews/2013/0506/6132.html 什么是观察者模式什么是观察者模式?你曾经订阅过报纸吗?在订阅报纸的 ...