[关闭]
@GivenCui 2016-05-25T20:23:06.000000Z 字数 6062 阅读 850

第二课 名片管理器(0524)_JS高级教程

js高级


目录



JS课程合集跳转链接


一. 名片管理器( eg.钱包 )

  • 名片用数组存储管理
  • 新建钱包实例
  • 新建名片实例
  • 新建三个方法: 增加、删除、显示

名片其实是一个数据模型

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>名片管理器(初级)</title>
  6. <script type = "text/javascript">
  7. /*
  8. 需求 : 名片管理器管理名片
  9. 构造函数 : 名片Card、名片管理器CardManager
  10. 名片属性 : 姓名、公司、电话、邮箱
  11. 名片管理器属性 : 名片数组
  12. 名片管理器方法 : 添加名片、显示所有名片信息、删除名片
  13. */
  14. // 名片构造函数
  15. function Card (name, company ,phoneNum ,email) {
  16. this.name = name;
  17. this.company = company;
  18. this.phoneNum = phoneNum;
  19. this.email = email;
  20. }
  21. // 名片管理器构造函数
  22. function CardManager () {
  23. // 名片数组的属性,用来存储名片的
  24. this.cards = new Array(); // 实际创建了个Array对象
  25. }
  26. // 添加名片的方法
  27. CardManager.prototype.addCard = function (newCard) {
  28. // 把名片添加到管理器的名片数组里
  29. // 栈 "先进后出"
  30. this.cards.push(newCard); // 入栈的操作
  31. }
  32. // 显示所有名片信息的方法
  33. CardManager.prototype.showAllCardInfo = function () {
  34. // 通过循环遍历卡片数组得到每个卡片对象
  35. for(var i = 0; i<this.cards.length; i++){
  36. // 遍历每个卡片对象
  37. var tempCard = this.cards[i];
  38. // 格式化输出
  39. console.log(" \n 名字: " + tempCard.name +" \n 公司: " + tempCard.company + " \n 电话: " + tempCard.phoneNum + " \n 邮箱: " + tempCard.email)
  40. }
  41. }
  42. }
  43. ////////////////////////////////////////////////////
  44. ///////////自己封装的工具方法//////////////////////
  45. // 模仿indexOf()方法
  46. // 给数组Array加的方法,所以this指定是Array这个对象
  47. Array.prototype.myIndexOf = function (removeCard) {
  48. for(var i = 0; i < this.length; i++) {
  49. if(this[i] === removeCard) {
  50. return i;
  51. }
  52. }
  53. return -1; // 模拟indexOf()没找到返回-1
  54. }
  55. // 模拟其他面向对象语言的按照指定元素删除的方法
  56. Array.prototype.removeObj = function (removeObj) {
  57. var index = this.myIndexOf(removeObj);
  58. if(index > -1){
  59. this.splice(index, 1);
  60. return;
  61. }
  62. console.log("没有找到要删除的名片!");
  63. }
  64. // 删除名片的方法
  65. // (因为JS中没有按照指定元素的方法,所以我们要通过给数组构造函数的原型添加额外的方法)
  66. CardManager.prototype.removeCard = function (removeCard) {
  67. this.cards.removeObj(removeCard);
  68. }
  69. /////////////////////////////////////////////////////////
  70. // 创建名片管理器对象实例
  71. var cardManager = new CardManager();
  72. // 创建很多名片对象
  73. // 数字存成字符串避免 数字类型 的上下限问题
  74. var card1 = new Card("Mars" , "育知同创" , "18688889999" , "Mars@163.com");
  75. var card2 = new Card("刘强东" , "京东" , "136000555" , "liuqingdong@126.com");
  76. var card3 = new Card("乔布斯" , "苹果" , "1869466513" , "Qiaobusi@qq.com");
  77. // 添加名片
  78. // 数组是有序的,用push
  79. // *****任何数组都是有序的,可以重复的****
  80. cardManager.addCard(card1);
  81. cardManager.addCard(card2);
  82. cardManager.addCard(card3);
  83. // 显示所有名片信息
  84. cardManager.showAllCardInfo();
  85. // 删除card3
  86. cardManager.removeCard(card3);
  87. // 打印分隔符
  88. console.log("------------------------------------")
  89. // 显示所有的名片信息
  90. cardManager.showAllCardInfo();
  91. // 验证删除不存在的名片信息
  92. var card4 = new Card("abc", "ddd" ,"能看见我不");
  93. // 删除card4
  94. cardManager.removeCard(card4);
  95. // 打印分隔符
  96. console.log("------------------------------------")
  97. // 显示所有的名片信息
  98. cardManager.showAllCardInfo();
  99. </script>
  100. </head>
  101. <body>
  102. </body>
  103. </html>

作业 : 书签管理器

书签是指浏览器中的书签,用面向对象思想实现
需求 : 查询、增加、删除、修改
构造函数 : 1. 数据模型 2. 管理器 3. 创建UI代码


拓展 : 表格的每一行是一个对象,例如购物车中的一行,用一个构造函数来实现


  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>书签管理器</title>
  6. <script type = "text/javascript">
  7. /*
  8. 需求: 通过书签管理器来管理网页中的书签项.
  9. 功能: 增、删、改、查
  10. 构造函数 : 书签管理器BookManager 、书签Book
  11. 书签的属性 : 网址url、标题title、星级star
  12. 书签管理的属性 : 书签数组books
  13. 书签管理器的方法 : 
  14. 1、添加书签 (要求不能重复添加标题或网址)
  15. 2、显示所有的标签信息 (要求: 按照星级排序)【查有待完善】
  16. 3、删除标签 (通过标题删除)
  17. 4、修改标签 (通过标题去修改)
  18. */
  19. // 书签构造函数 (属性:网址、标题、星级)
  20. function Book (url, title, star) {
  21. this.url = url; // 书签的网址属性 url
  22. this.title = title; // 书签的标题属性 title
  23. this.star = star; // 书签的星级属性 star
  24. }
  25. // 书签管理器构造函数 (属性 : 书签数组)
  26. function BookManager () {
  27. // 书签数组属性
  28. // 这是属性,同时也是一个数组对象实例(本质)
  29. this.books = new Array();
  30. }
  31. // 添加书签的方法
  32. // Prototype模式添加方法
  33. // newBook是一个对象
  34. BookManager.prototype.addBook = function (newBook) {
  35. // 遍历书签数组中的每个书签,目的是和新加的书签做判断
  36. for (var i = 0; i< this.books.length; i++) {
  37. // 得到每个书签对象
  38. var temBook = this.books[i];
  39. // 为了实现不能重复添加标题或网址的需求
  40. if (temBook.title === newBook.title || temBook.url === newBook.url) {
  41. console.log("网址已经存在");
  42. return; // 函数结束
  43. }
  44. }
  45. // this指向BookManager对象
  46. // 用 books属性 (同时也是数组)
  47. // 经过循环判断没有重复的才可以添加新标签
  48. this.books.push(newBook);
  49. };
  50. // 显示所有标签信息的方法 (要求 : 按照星级star排序)
  51. // 拓展: 传个参数实现升序排序和降序排序
  52. BookManager.prototype.showAllBookInfo = function () {
  53. // 冒泡排序星级从大到小
  54. for (var i = 0; i < this.books.length-1; i++) {
  55. for(var j=0;j<this.books.length-1-i; j++) {
  56. // 把位置为j和j+1的对象取出
  57. var tempBook1 = this.books[j];
  58. var tempBook2 = this.books[j+1];
  59. // 判断相邻两个对象的星级属性大小
  60. if (tempBook1.star >= tempBook2.star) {
  61. // 利用数组的splice()方法来实现两个位置替换
  62. this.books.splice(j,1,tempBook2);
  63. this.books.splice(j+1,1,tempBook1);
  64. }
  65. }
  66. // 格式化输出书签信息
  67. for (var i = 0; i < this.books.length; i++) {
  68. // 得到每一个书签对象
  69. var tempBook = this.books[i];
  70. // 格式化输出书签信息
  71. console.log(" \n 标题: " + tempBook.title + " \n 网址: " + tempBook.url + " \n 星级: " + tempBook.star);
  72. }
  73. }
  74. };
  75. // 给数组构造函数的原型添加方法 (从删除中抽离出来的)
  76. // 按指定的标题查找元素的下标,并返回
  77. Array.prototype.myIndexOf = function (removeTitle) {
  78. for (var i = 0; i < this.length; i++){
  79. // 得到数组里的每个元素
  80. var tempObj = this[i]; // this好强大
  81. //找到匹配项并返回下标
  82. if (tempObj.title === removeTitle){
  83. return i;
  84. }
  85. }
  86. return -1; // 没找到的时候返回-1,模拟indexOf()方法
  87. };
  88. // 给数组构造函数的原型添加方法(通过指定元素的标题删除)
  89. Array.prototype.removeObj = function (removeTitle) {
  90. var idx = this.myIndexOf(removeTitle);
  91. if (idx > -1) {
  92. this.splice(idx, 1);
  93. return;
  94. }
  95. console.log("没有找到该标题的书签! ");
  96. };
  97. // 删除书签
  98. // removeTitle是个字符串,这里传的不是对象
  99. BookManager.prototype.removeBook = function (removeTitle) {
  100. // 正常的方法
  101. /*for (var i = 0; i < this.books.length; i++) {
  102. if (this.books[i].title === removeTitle) {
  103. this.books.splice(i, 1);
  104. break;
  105. }
  106. }*/
  107. this.books.removeObj(removeTitle);
  108. };
  109. // 通过标题修改书签的所有属性 (这里只举例修改url)
  110. BookManager.prototype.modifyBookUrlByTitle = function (targetTitle,modifyUrl) {
  111. // 遍历书签数组,得到每一个书签对象
  112. for (var i = 0; i < this.books.length; i++) {
  113. // 得到每一个书签对象
  114. var tempBook = this.books[i];
  115. // 找到给定标题元素
  116. if (tempBook.title === targetTitle) {
  117. // 找到后,修改该书签的url
  118. tempBook.url = modifyUrl;
  119. return;
  120. }
  121. }
  122. console.log("没有匹配的书签可以修改");
  123. };
  124. /*****************以上构造函数相关**************************/
  125. // 创建一个书签管理器对象
  126. var bookManager = new BookManager();
  127. // 创建一堆书签对象
  128. var book1 = new Book("www.baidu.com", "百度", 2);
  129. var book2 = new Book("www.tencent.com", "腾讯", 3);
  130. var book3 = new Book("www.google.com", "谷歌", 5);
  131. var book4 = new Book("www.163.com", "网易", 4);
  132. var book5 = new Book("www.sina.com", "百度", 5); // 验证
  133. var book6 = new Book("www.baidu.com", "必读",1); // 验证
  134. // 添加书签 (完善成批量添加)
  135. bookManager.addBook(book1);
  136. bookManager.addBook(book2);
  137. bookManager.addBook(book3);
  138. bookManager.addBook(book4);
  139. bookManager.addBook(book5);
  140. bookManager.addBook(book6);
  141. // 显示所有书签信息
  142. bookManager.showAllBookInfo();
  143. // 删除腾讯书签
  144. bookManager.removeBook("腾讯");
  145. // 打印分隔符
  146. console.log("********************************");
  147. // 显示所有书签信息
  148. bookManager.showAllBookInfo();
  149. // 修改书签
  150. bookManager.modifyBookUrlByTitle("网易","www.1234.com");
  151. // 打印分隔符
  152. console.log("********************************");
  153. // 显示所有书签信息
  154. bookManager.showAllBookInfo();
  155. //修改书签(通过标题修改网址)
  156. bookManager.modifyBookUrlByTitle("网易2", "www.120.com");
  157. //打印分隔符
  158. console.log("===================");
  159. //显示所有书签信息
  160. bookManager.showAllBookInfo();
  161. </script>
  162. </head>
  163. <body>
  164. </body>
  165. </html>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注