JavaScript面向对象编写购物车功能


Posted in Javascript onAugust 19, 2016

之前的项目中需要一个购买数据商品并付款的功能,刚开始一直不敢使用面向对象的写法,主要是没有理清思路,而且那时的数据商品比较的复杂,就一直没敢动,在网上也找些面向对象的写法,把思路理清一遍,就想自己试着写写。 

接下来我会一步一步分析,面向对象的写法过程。整个流程大致分为:               
1、先定义好一个商品列表的数据形式和商品总数集,类似: 

var data = [{name: 'name', unitPrice: 10, num: 2}];
var total = {type: 0, totalNum: 0, price: 0};

很明显在 data 数组里 name 表示单个商品名称,unitPrice 表示单个商品单价,num 表示单个商品数量;在 total 对象里 type 表示商品种类、totalNum 表示商品总数量、price 表示商品总价。

2、创建一个购物车的函数对象 ShoppingCart,并设置它的相应属性,如下:

function ShoppingCart (name, unitPrice, num) {
  this.name   = name;
  this.unitPrice = unitPrice;
  this.num    = num;
  this.info   = {name: this.name,unitPrice: this.unitPrice,num: this.num};
}

用一个 info 来把单个商品的名称、单价、数量保存起来,然后需要把这个 info 放到 data 数组里并且计算商品总数集 total,所以就需要设置这个函数对象的两个方法。就在 this.info 下面添加两个方法: 

this.add();
this.getTotal();
这里要说明一下,为什么要把这两个方法放在函数对象的原型里,当 new 一个实例化对象时,就需要马上添加这个商品信息和计算商品总数集,所以没必要再用这个实例化对象调用这两个方法。 

然后使用对象的 prototype 属性,把方法都放在这个属性里来调用,如下: 

ShoppingCart.prototype = {
  // 添加商品
  add: function() {
    var _this = this;
    data.push(_this.info); 
  },
  // 商品总数集
  getTotal: function () {
    total.type   = data.length;
    total.totalNum = 0;
    total.price  = 0;
    for (var i = 0; i < data.length; i++) {
      total.totalNum += data[i].num;
      total.price  += data[i].num * data[i].unitPrice;             
    }   
  }
}

3、有添加就会有删除单个商品,就在 prototype 属性里再添加删除商品的方法,删除商品需要依据一个标识来删除指定的商品,这里我通过 name 值来删除,这时就需要一个方法去 date 数组里找对应这个 name 的商品,如下: 

// 删除商品
delect: function () {
  var _this = this;
  data.splice(_this.check(_this.name), 1);
  _this.getTotal();
},
// 根据名称查商品
check: function (name) {
  for (var i = 0; i < data.length; i++) {
    if (name == data[i].name) return i;
  }
}

4、修改单个商品数量,如下: 

// 修改单个商品的数量
changeNum: function (num) {
  var _this = this;
  if (num == 0) {
    _this.delect();
    return;
  }
  var _index = _this.check(_this.name);
  data[_index].num = num;
  _this.getTotal();
}

这里需要传一个参数,来设置指定的商品的数量。 

整体代码如下: 

var data  = new Array;
var total  = {type: 0, totalNum : 0, price:0};
function ShoppingCart (name, unitPrice, num) {
  this.name   = name;
  this.unitPrice = unitPrice;
  this.num    = num;
  this.info   = {name: this.name,unitPrice: this.unitPrice,num: this.num};
  this.add();
  this.getTotal();
}
ShoppingCart.prototype = {
  add: function() {
    var _this = this;
    data.push(_this.info); 
  },
  getTotal: function () {
    total.type = data.length;
    total.totalNum  = 0;
    total.price = 0;
    for (var i = 0; i < data.length; i++) {
      total.totalNum  += data[i].num;
      total.price += data[i].num * data[i].unitPrice;             
    }   
  },
  delect: function () {
    var _this = this;
    data.splice(_this.check(_this.name), 1);
    _this.getTotal();
  },
  changeNum: function (num) {
    var _this = this;
    if (num == 0) {
      _this.delect();
      return;
    }
    var _index = _this.check(_this.name);
    data[_index].num = num;
    _this.getTotal();
  },
  check: function (name) {
    for (var i = 0; i < data.length; i++) {
      if (name == data[i].name) return i;
    }
  }
}

这个 data 数组初始化数据可以是从后台传过来的数据,但是必须数据形式和定义的一样,并且要调用一下 getTotal 这个方法获取商品总数集。 

最后就是简单的 new 一个个实例化,例如: 

var goods1 = new ShoppingCart('123', 100, 2 )
var goods2 = new ShoppingCart('456', 10, 3 )
var goods3 = new ShoppingCart('789', 1, 4 )

goods2.delect();
good3.changeNum(2)
goods2 = new ShoppingCart('1234', 11, 1 )
goods2.changeNum(0)

自行可以把 data 和 total 打印出来看看结果\(^o^)/~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用js解决数字不能换行问题
Aug 10 Javascript
indexOf 和 lastIndexOf 使用示例介绍
Sep 02 Javascript
jQuery给多个不同元素添加class样式的方法
Mar 26 Javascript
js操作数据库实现注册和登陆的简单实例
May 26 Javascript
利用Node.js制作爬取大众点评的爬虫
Sep 22 Javascript
浅谈js的ajax的异步和同步请求的问题
Oct 07 Javascript
jQuery动态添加与删除tr行实例代码
Oct 18 Javascript
EasyUI折叠表格层次显示detailview详解及实例
Dec 28 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
Vue2.0生命周期的理解
Aug 20 Javascript
JavaScript遍历DOM元素的常见方式示例
Feb 16 Javascript
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
Apr 16 Javascript
javascript设计模式之module(模块)模式
Aug 19 #Javascript
JS实现六位字符密码输入器功能
Aug 19 #Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 #Javascript
巧用jQuery选择器提高写表单效率的方法
Aug 19 #Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
Aug 19 #Javascript
JavaScript使用键盘输入控制实现数字验证功能
Aug 19 #Javascript
jQuery Validate插件实现表单验证
Aug 19 #Javascript
You might like
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
javascript 打印页面代码
2009/03/24 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
javascript 实现map集合
2015/04/03 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
js回调函数原理与用法案例分析
2020/03/04 Javascript
js实现时钟定时器
2020/03/26 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
Python牛刀小试密码爆破
2011/02/03 Python
Python中使用SAX解析xml实例
2014/11/21 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
python实现简易内存监控
2018/06/21 Python
python requests.post带head和body的实例
2019/01/02 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
成绩单家长意见
2015/06/03 职场文书
尼克胡哲观后感
2015/06/08 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js