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 相关文章推荐
使用TextRange获取输入框中光标的位
Oct 14 Javascript
极酷的javascirpt,让你随意编辑任何网页
Feb 25 Javascript
jquery text(),val(),html()方法区别总结
Nov 04 Javascript
JQuery实现的图文自动轮播效果插件
Jun 19 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
Oct 23 Javascript
jQuery实现简单的文件上传进度条效果
Mar 26 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
Apr 07 Javascript
jQuery简单获取DIV和A标签元素位置的方法
Feb 07 Javascript
JS原生带小白点轮播图实例讲解
Jul 22 Javascript
vue写一个组件
Apr 09 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
Feb 15 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
May 01 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
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
php常用的安全过滤函数集锦
2014/10/09 PHP
PHP文件操作详解
2016/12/30 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
图片自动缩小 点击放大
2008/07/07 Javascript
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
Jquery Easyui日历组件Calender使用详解(23)
2016/12/18 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
2017/09/18 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
Python的Flask框架与数据库连接的教程
2015/04/20 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
学习委员自我鉴定
2014/01/13 职场文书
高三自我评价
2014/02/01 职场文书
主题婚礼策划方案
2014/02/10 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
企业承诺书格式
2014/05/21 职场文书
党员创先争优心得体会
2014/09/11 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
为什么RedisCluster设计成16384个槽
2021/09/25 Redis