@GivenCui
2016-05-25T20:23:06.000000Z
字数 6062
阅读 847
js高级
- 名片用数组存储管理
- 新建钱包实例
- 新建名片实例
- 新建三个方法: 增加、删除、显示
名片其实是一个数据模型
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>名片管理器(初级)</title>
<script type = "text/javascript">
/*
需求 : 名片管理器管理名片
构造函数 : 名片Card、名片管理器CardManager
名片属性 : 姓名、公司、电话、邮箱
名片管理器属性 : 名片数组
名片管理器方法 : 添加名片、显示所有名片信息、删除名片
*/
// 名片构造函数
function Card (name, company ,phoneNum ,email) {
this.name = name;
this.company = company;
this.phoneNum = phoneNum;
this.email = email;
}
// 名片管理器构造函数
function CardManager () {
// 名片数组的属性,用来存储名片的
this.cards = new Array(); // 实际创建了个Array对象
}
// 添加名片的方法
CardManager.prototype.addCard = function (newCard) {
// 把名片添加到管理器的名片数组里
// 栈 "先进后出"
this.cards.push(newCard); // 入栈的操作
}
// 显示所有名片信息的方法
CardManager.prototype.showAllCardInfo = function () {
// 通过循环遍历卡片数组得到每个卡片对象
for(var i = 0; i<this.cards.length; i++){
// 遍历每个卡片对象
var tempCard = this.cards[i];
// 格式化输出
console.log(" \n 名字: " + tempCard.name +" \n 公司: " + tempCard.company + " \n 电话: " + tempCard.phoneNum + " \n 邮箱: " + tempCard.email)
}
}
}
////////////////////////////////////////////////////
///////////自己封装的工具方法//////////////////////
// 模仿indexOf()方法
// 给数组Array加的方法,所以this指定是Array这个对象
Array.prototype.myIndexOf = function (removeCard) {
for(var i = 0; i < this.length; i++) {
if(this[i] === removeCard) {
return i;
}
}
return -1; // 模拟indexOf()没找到返回-1
}
// 模拟其他面向对象语言的按照指定元素删除的方法
Array.prototype.removeObj = function (removeObj) {
var index = this.myIndexOf(removeObj);
if(index > -1){
this.splice(index, 1);
return;
}
console.log("没有找到要删除的名片!");
}
// 删除名片的方法
// (因为JS中没有按照指定元素的方法,所以我们要通过给数组构造函数的原型添加额外的方法)
CardManager.prototype.removeCard = function (removeCard) {
this.cards.removeObj(removeCard);
}
/////////////////////////////////////////////////////////
// 创建名片管理器对象实例
var cardManager = new CardManager();
// 创建很多名片对象
// 数字存成字符串避免 数字类型 的上下限问题
var card1 = new Card("Mars" , "育知同创" , "18688889999" , "Mars@163.com");
var card2 = new Card("刘强东" , "京东" , "136000555" , "liuqingdong@126.com");
var card3 = new Card("乔布斯" , "苹果" , "1869466513" , "Qiaobusi@qq.com");
// 添加名片
// 数组是有序的,用push
// *****任何数组都是有序的,可以重复的****
cardManager.addCard(card1);
cardManager.addCard(card2);
cardManager.addCard(card3);
// 显示所有名片信息
cardManager.showAllCardInfo();
// 删除card3
cardManager.removeCard(card3);
// 打印分隔符
console.log("------------------------------------")
// 显示所有的名片信息
cardManager.showAllCardInfo();
// 验证删除不存在的名片信息
var card4 = new Card("abc", "ddd" ,"能看见我不");
// 删除card4
cardManager.removeCard(card4);
// 打印分隔符
console.log("------------------------------------")
// 显示所有的名片信息
cardManager.showAllCardInfo();
</script>
</head>
<body>
</body>
</html>
书签是指浏览器中的书签,用面向对象思想实现
需求 : 查询、增加、删除、修改
构造函数 : 1. 数据模型 2. 管理器 3. 创建UI代码
拓展 : 表格的每一行是一个对象,例如购物车中的一行,用一个构造函数来实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>书签管理器</title>
<script type = "text/javascript">
/*
需求: 通过书签管理器来管理网页中的书签项.
功能: 增、删、改、查
构造函数 : 书签管理器BookManager 、书签Book
书签的属性 : 网址url、标题title、星级star
书签管理的属性 : 书签数组books
书签管理器的方法 :
1、添加书签 (要求不能重复添加标题或网址)
2、显示所有的标签信息 (要求: 按照星级排序)【查有待完善】
3、删除标签 (通过标题删除)
4、修改标签 (通过标题去修改)
*/
// 书签构造函数 (属性:网址、标题、星级)
function Book (url, title, star) {
this.url = url; // 书签的网址属性 url
this.title = title; // 书签的标题属性 title
this.star = star; // 书签的星级属性 star
}
// 书签管理器构造函数 (属性 : 书签数组)
function BookManager () {
// 书签数组属性
// 这是属性,同时也是一个数组对象实例(本质)
this.books = new Array();
}
// 添加书签的方法
// Prototype模式添加方法
// newBook是一个对象
BookManager.prototype.addBook = function (newBook) {
// 遍历书签数组中的每个书签,目的是和新加的书签做判断
for (var i = 0; i< this.books.length; i++) {
// 得到每个书签对象
var temBook = this.books[i];
// 为了实现不能重复添加标题或网址的需求
if (temBook.title === newBook.title || temBook.url === newBook.url) {
console.log("网址已经存在");
return; // 函数结束
}
}
// this指向BookManager对象
// 用 books属性 (同时也是数组)
// 经过循环判断没有重复的才可以添加新标签
this.books.push(newBook);
};
// 显示所有标签信息的方法 (要求 : 按照星级star排序)
// 拓展: 传个参数实现升序排序和降序排序
BookManager.prototype.showAllBookInfo = function () {
// 冒泡排序星级从大到小
for (var i = 0; i < this.books.length-1; i++) {
for(var j=0;j<this.books.length-1-i; j++) {
// 把位置为j和j+1的对象取出
var tempBook1 = this.books[j];
var tempBook2 = this.books[j+1];
// 判断相邻两个对象的星级属性大小
if (tempBook1.star >= tempBook2.star) {
// 利用数组的splice()方法来实现两个位置替换
this.books.splice(j,1,tempBook2);
this.books.splice(j+1,1,tempBook1);
}
}
// 格式化输出书签信息
for (var i = 0; i < this.books.length; i++) {
// 得到每一个书签对象
var tempBook = this.books[i];
// 格式化输出书签信息
console.log(" \n 标题: " + tempBook.title + " \n 网址: " + tempBook.url + " \n 星级: " + tempBook.star);
}
}
};
// 给数组构造函数的原型添加方法 (从删除中抽离出来的)
// 按指定的标题查找元素的下标,并返回
Array.prototype.myIndexOf = function (removeTitle) {
for (var i = 0; i < this.length; i++){
// 得到数组里的每个元素
var tempObj = this[i]; // this好强大
//找到匹配项并返回下标
if (tempObj.title === removeTitle){
return i;
}
}
return -1; // 没找到的时候返回-1,模拟indexOf()方法
};
// 给数组构造函数的原型添加方法(通过指定元素的标题删除)
Array.prototype.removeObj = function (removeTitle) {
var idx = this.myIndexOf(removeTitle);
if (idx > -1) {
this.splice(idx, 1);
return;
}
console.log("没有找到该标题的书签! ");
};
// 删除书签
// removeTitle是个字符串,这里传的不是对象
BookManager.prototype.removeBook = function (removeTitle) {
// 正常的方法
/*for (var i = 0; i < this.books.length; i++) {
if (this.books[i].title === removeTitle) {
this.books.splice(i, 1);
break;
}
}*/
this.books.removeObj(removeTitle);
};
// 通过标题修改书签的所有属性 (这里只举例修改url)
BookManager.prototype.modifyBookUrlByTitle = function (targetTitle,modifyUrl) {
// 遍历书签数组,得到每一个书签对象
for (var i = 0; i < this.books.length; i++) {
// 得到每一个书签对象
var tempBook = this.books[i];
// 找到给定标题元素
if (tempBook.title === targetTitle) {
// 找到后,修改该书签的url
tempBook.url = modifyUrl;
return;
}
}
console.log("没有匹配的书签可以修改");
};
/*****************以上构造函数相关**************************/
// 创建一个书签管理器对象
var bookManager = new BookManager();
// 创建一堆书签对象
var book1 = new Book("www.baidu.com", "百度", 2);
var book2 = new Book("www.tencent.com", "腾讯", 3);
var book3 = new Book("www.google.com", "谷歌", 5);
var book4 = new Book("www.163.com", "网易", 4);
var book5 = new Book("www.sina.com", "百度", 5); // 验证
var book6 = new Book("www.baidu.com", "必读",1); // 验证
// 添加书签 (完善成批量添加)
bookManager.addBook(book1);
bookManager.addBook(book2);
bookManager.addBook(book3);
bookManager.addBook(book4);
bookManager.addBook(book5);
bookManager.addBook(book6);
// 显示所有书签信息
bookManager.showAllBookInfo();
// 删除腾讯书签
bookManager.removeBook("腾讯");
// 打印分隔符
console.log("********************************");
// 显示所有书签信息
bookManager.showAllBookInfo();
// 修改书签
bookManager.modifyBookUrlByTitle("网易","www.1234.com");
// 打印分隔符
console.log("********************************");
// 显示所有书签信息
bookManager.showAllBookInfo();
//修改书签(通过标题修改网址)
bookManager.modifyBookUrlByTitle("网易2", "www.120.com");
//打印分隔符
console.log("===================");
//显示所有书签信息
bookManager.showAllBookInfo();
</script>
</head>
<body>
</body>
</html>