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 相关文章推荐
onsubmit阻止form表单提交与onclick的相关操作
Sep 03 Javascript
javascript中length属性的探索
Jul 31 Javascript
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
初步使用bootstrap快速创建页面
Mar 03 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
Mar 04 Javascript
利用Vue.js实现checkbox的全选反选效果
Jan 18 Javascript
Angular4开发解决跨域问题详解
Aug 28 Javascript
写给vue新手们的vue渲染页面教程
Sep 01 Javascript
JS实现图片切换特效
Dec 23 Javascript
vue fetch中的.then()的正确使用方法
Apr 17 Javascript
React中的Context应用场景分析
Jun 11 Javascript
原生JS实现分页
Apr 19 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调用Oracle存储过程的方法
2008/09/12 PHP
PHP 上传文件大小限制
2009/07/05 PHP
php生成随机密码的三种方法小结
2010/09/04 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
python处理excel绘制雷达图
2019/10/18 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
python实现处理mysql结果输出方式
2020/04/09 Python
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
邮政员工辞职信
2014/01/16 职场文书
外国人聘用意向书
2014/04/01 职场文书
二十年同学聚会感言
2015/07/30 职场文书
企业团队精神心得体会
2016/01/19 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript