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 相关文章推荐
使两个iframe的高度与内容自适应,且相等
Nov 20 Javascript
javascript 装载iframe子页面,自适应高度
Mar 20 Javascript
JS 文件本身编码转换 图文教程
Oct 12 Javascript
JS图片根据鼠标滚动延时加载的实例代码
Jul 13 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
Oct 17 Javascript
JavaScript中的操作符==与===介绍
Dec 31 Javascript
javascript通过元素id和name直接取得元素的方法
Apr 28 Javascript
jQuery的remove()方法使用详解
Aug 11 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
Oct 13 Javascript
JS中位置与大小的获取方法
Nov 22 Javascript
AngularJS前端页面操作之用户修改密码功能示例
Mar 27 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
May 15 jQuery
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
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
小议Javascript中的this指针
2010/03/18 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
js 操作符汇总
2014/11/08 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
在Django中创建第一个静态视图
2015/07/15 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
python3+PyQt5实现柱状图
2018/04/24 Python
如何使用Python 打印各种三角形
2019/06/28 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Python ORM编程基础示例
2020/02/02 Python
Python中Selenium模块的使用详解
2020/10/09 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技