js中处处是对象,面向对象的第一步当然就是封装了,由于Js中没有类的概念,所以封装起来也比较麻烦,下面介绍两种js的封装。

1、使用约定优先的原则,将所有的私有变量以_开头

  1. <script type="text/javascript">
  2. /**
  3. * 使用约定优先的原则,把所有的私有变量都使用_开头
  4. */
  5. var Person = function (no, name, age)
  6. {
  7. this.setNo(no);
  8. this.setName(name);
  9. this.setAge(age);
  10. }
  11. Person.prototype = {
  12. constructor: Person,
  13. checkNo: function (no)
  14. {
  15. if (!no.constructor == "string" || no.length != 4)
  16. throw new Error("学号必须为4位");
  17. },
  18. setNo: function (no)
  19. {
  20. this.checkNo(no);
  21. this._no = no;
  22. }, getNo: function ()
  23. {
  24. return this._no;
  25. }, setName: function (name)
  26. {
  27. this._name = name;
  28. }, getName: function ()
  29. {
  30. return this._name;
  31. }, setAge: function (age)
  32. {
  33. this._age = age;
  34. }, getAge: function ()
  35. {
  36. return this._age;
  37. }, toString: function ()
  38. {
  39. return "no = " + this._no + " , name = " + this._name + " , age = " + this._age;
  40. }
  41. };
  42. var p1 = new Person("0001", "鸿洋", "22");
  43. console.log(p1.toString());        //no = 0001 , name = 鸿洋 , age = 22
  44. p1.setNo("0003");
  45. console.log(p1.toString());      //no = 0003 , name = 鸿洋 , age = 22
  46. p1.no = "0004";
  47. p1._no = "0004";
  48. console.log(p1.toString());    //no = 0004 , name = 鸿洋 , age = 22
  49. </script>

看完代码,是不是有种被坑的感觉,仅仅把所有的变量以_开头,其实还是可以直接访问的,这能叫封装么,当然了,说了是约定优先嘛,这种方式还是不错 的,最起码成员变量的getter,setter方法都是prototype中,并非存在对象中,总体来说还是个不错的选择。如果你觉得,这不行,必须严 格实现封装,那么看第二种方式。

2、严格实现封装

  1. <script type="text/javascript">
  2. /**
  3. *  使用这种方式虽然可以严格实现封装,但是带来的问题是get和set方法都不能存储在prototype中,都是存储在对象中的
  4. * 这样无形中就增加了开销
  5. */
  6. var Person = function (no, name, age)
  7. {
  8. var _no , _name, _age ;
  9. var checkNo = function (no)
  10. {
  11. if (!no.constructor == "string" || no.length != 4)
  12. throw new Error("学号必须为4位");
  13. };
  14. this.setNo = function (no)
  15. {
  16. checkNo(no);
  17. _no = no;
  18. };
  19. this.getNo = function ()
  20. {
  21. return _no;
  22. }
  23. this.setName = function (name)
  24. {
  25. _name = name;
  26. }
  27. this.getName = function ()
  28. {
  29. return _name;
  30. }
  31. this.setAge = function (age)
  32. {
  33. _age = age;
  34. }
  35. this.
  36. getAge = function ()
  37. {
  38. return _age;
  39. }
  40. this.setNo(no);
  41. this.setName(name);
  42. this.setAge(age);
  43. }
  44. Person.prototype = {
  45. constructor: Person,
  46. toString: function ()
  47. {
  48. return "no = " + this.getNo() + " , name = " + this.getName() + " , age = " + this.getAge();
  49. }
  50. }
  51. ;
  52. var p1 = new Person("0001", "鸿洋", "22");
  53. console.log(p1.toString());        //no = 0001 , name = 鸿洋 , age = 22
  54. p1.setNo("0003");
  55. console.log(p1.toString());      //no = 0003 , name = 鸿洋 , age = 22
  56. p1.no = "0004";
  57. console.log(p1.toString());    //no = 0003 , name = 鸿洋 , age = 22
  58. </script>

看上面的代码,去掉了this.属性名,严格的实现了封装,只能通过getter,setter访问成员变量了,但是存在一个问题,所有的方法都存在对象中,增加了内存的开销。

3、以闭包的方式封装

  1. <script type="text/javascript">
  2. /**
  3. *  使用这种方式虽然可以严格实现封装,但是带来的问题是get和set方法都不能存储在prototype中,都是存储在对象中的
  4. * 这样无形中就增加了开销
  5. */
  6. var Person = (function ()
  7. {
  8. var checkNo = function (no)
  9. {
  10. if (!no.constructor == "string" || no.length != 4)
  11. throw new Error("学号必须为4位");
  12. };
  13. //共享变量
  14. var times = 0;
  15. return function (no, name, age)
  16. {
  17. console.log(times++);    // 0 ,1 , 2
  18. var no , name , age;
  19. this.setNo = function (no)
  20. {
  21. checkNo(no);
  22. this._no = no;
  23. };
  24. this.getNo = function ()
  25. {
  26. return this._no;
  27. }
  28. this.setName = function (name)
  29. {
  30. this._name = name;
  31. }
  32. this.getName = function ()
  33. {
  34. return this._name;
  35. }
  36. this.setAge = function (age)
  37. {
  38. this._age = age;
  39. }
  40. this.
  41. getAge = function ()
  42. {
  43. return this._age;
  44. }
  45. this.setNo(no);
  46. this.setName(name);
  47. this.setAge(age);
  48. }
  49. })();
  50. Person.prototype = {
  51. constructor: Person,
  52. toString: function ()
  53. {
  54. return "no = " + this._no + " , name = " + this._name + " , age = " + this._age;
  55. }
  56. }
  57. ;
  58. var p1 = new Person("0001", "鸿洋", "22");
  59. var p2 = new Person("0002", "abc", "23");
  60. var p3 = new Person("0003", "aobama", "24");
  61. console.log(p1.toString());        //no = 0001 , name = 鸿洋 , age = 22
  62. console.log(p2.toString());      //no = 0002 , name = abc , age = 23
  63. console.log(p3.toString());    //no = 0003 , name = aobama , age = 24
  64. </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 进阶 封装的更多相关文章

  1. JavaScript进阶(十一)JsJava2.0版本

    JavaScript进阶(十一)JsJava2.0版本 2007年9月11日,JsJava团队发布了JsJava2.0版本,该版本不仅增加了许多新的类库,而且参照J2SE1.4,大量使用了类的继承和实 ...

  2. javascript进阶课程--第二章--对象

    javascript进阶课程--第二章--对象 学习要点 理解面向对象的概念 掌握对象的创建方法 掌握继承的概念和实现方法 基本概念 对象究竟是什么?什么叫面向对象编程? 对象是从我们现实生活中抽象出 ...

  3. javascript进阶课程--第三章--匿名函数和闭包

    javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...

  4. JavaScript进阶之高阶函数篇

    JavaScript进阶之高阶函数篇 简介:欢迎大家来到woo爷说前端:今天给你们带来的是JavaScript进阶的知识,接下来的系列都是围绕着JavaScript进阶进行阐述:首先我们第一篇讲的是高 ...

  5. JavaScript进阶内容——jQuery

    JavaScript进阶内容--jQuery 我们在前面的文章中已经掌握了JavaScript的全部内容,现在让我们了解一下JavaScript库 这篇文章主要是为了为大家大致讲解JavaScript ...

  6. 2016/11/17 周四 <javascript的封装简单示例>

    这是一个简单的javascript代码封装的示例以及封装后的调用方法: var ticker={ n:0, add:function() { this.n++; }, show:function() ...

  7. #笔记#JavaScript进阶篇一

    #JavaScript进阶篇 http://www.imooc.com/learn/10 #认识DOM #window对象 浏览器窗口可视区域监测—— 在不同浏览器(PC)都实用的 JavaScrip ...

  8. 4、JavaScript进阶篇①——基础语法

    一.认识JS 你知道吗,Web前端开发师需要掌握什么技术?也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HTML+CSS创建一个漂亮的页面,但这还不够,它只是静态页面 ...

  9. JavaScript 进阶(一)JS的"多线程"

    这个系列的文章名为“JavaScript 进阶”,内容涉及JS中容易忽略但是很有用的,偏JS底层的,以及复杂项目中的JS的实践.主要来源于我几年的开发过程中遇到的问题.小弟第一次写博客,写的不好的地方 ...

随机推荐

  1. mvc请求过程总结

    前言 最近在思考一个问题,我的学习方法一般主要是看博客来学习新东西,但是光看,基本也没总结过,所以经常会出现这样的问题,某个知识点我知道,但是就是不能很好的表达出来,很简单的东西往往都不知道如何简短精 ...

  2. ThinkPHP - F函数,更新配置文件

    Html代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&quo ...

  3. jz2440开发板设置备份

    ___________________uboot______________________________________ OpenJTAG> pribootdelay=2baudrate=1 ...

  4. Ural 1197 - Lonesome Knight

    The statement of this problem is very simple: you are to determine how many squares of the chessboar ...

  5. Tcl语言笔记之二

    1,表达式 1.1 操作数 TCL表达式的操作数通常是整数或实数.整数一般是十进制的, 但如果整数的第一个字符是0(zero),那么TCL将把这个整数看作八进制的,如果前两个字符是0x则这个整数被看作 ...

  6. JS给元素增加className

    function(element,value) //给元素添加className { if(!element.className) { element.className=value; } else{ ...

  7. W3C 、HTML 、CSS 发展介绍

    一.W3C W3C 指万维网联盟(World Wide Web Consortium),创建于1994年10月,由 Tim Berners-Lee (他是html的发明人)创建. W3C开始被创建的目 ...

  8. css如何li中选中后加上class属性js控制

    <ul> <li class=""pageson"><span>1</span></li> <li> ...

  9. oschina插件和扩展

    Eclipse插件 2551FireFox插件 14IE插件 19Prototype扩展 220Chrome插件/扩展 72WordPress插件 33NetBeans插件 12IDEA插件 25Xc ...

  10. 找唯一不出现三次而出现1次的数子O(n)位运算算法

    之前两次那个是异或运算处理.这次以为也是类似.可是没想出来. 高富帅想出来了算法,转为bitset,然后加起来 同样的话 要么0+0+0 要么1+1+1,最后剩下的 能够通过%3 算出0 或1.思想是 ...