面向对象——购物车

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

接下来我会一步一步分析,面向对象的写法过程。整个流程大致分为:

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 数组可以是从后台传过来的数据,但是必须数据形式和定义的一样。

最后就是简单的 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^)/~

时间: 2024-10-08 09:46:46

面向对象——购物车的相关文章

面向对象--购物车

之前的项目中需要一个购买数据商品并付款的功能,刚开始一直不敢使用面向对象的写法,主要是没有理清思路,而且那时的数据商品比较的复杂,就一直没敢动,在网上也找些面向对象的写法,把思路理清一遍,就想自己试着写写. 接下来我会一步一步分析,面向对象的写法过程.整个流程大致分为: 1.先定义好一个商品列表的数据形式和商品总数集,类似: var data = [{name: 'name', unitPrice: 10, num: 2}]; var total = {type: 0, totalNum: 0,

Python基础(正则、序列化、常用模块和面向对象)-day06

写在前面 上课第六天,打卡: 天地不仁,以万物为刍狗: 一.正则 - - 在线正则工具:http://tool.oschina.net/regex/ - 二.序列化 - json - pickle 三.常用模块介绍 - time - random - os - sys - shutil - shelve - xml - configparser - hashlib - subprocess - logging - re - ... 四.面向对象 - 五.day06课后作业 题目要求: - 模拟实

关于面向对象的一些理念

生活中,任何实体都可以看做一个对象,比如人,动物,汽车,飞机,苹果,香蕉.对象又分成抽象和抽象.比如人是抽象的,具体的某个人是具体的,如张三.李四是具体的.因此常用new操作符来实例化一个对象. 我们要有面向对象编程思维,比如开发京东商城产品详细信息,我们可以定义一个产品对象属性:名称,描述,价格方法:就是行为-比如添加到购物车,查看产品详细信息比如开发京东商城购物车,我们可以定义一个购物车对象属性:产品列表,总价格方法:获取产品列表,计算产品总价格(当修改产品个数需要重新计算),可以采用双对象

购物车总结

最近学习面向对象,然后做购物车小项目,虽然说是小项目,但是对于我来说难度真的很大.特别是关于一些参数的传值. 面向对象.PDO.smarty,学习起来真的感觉很困难,这几天真的是对学习都丧失的了兴趣,因 为我真的觉得太难了,感觉自己什么也不会, 压力很大,现在都是这种情况,不知道上班后更会是什么,每天都很累,不是产生消极心理,而是自己感觉真的很无能为力!

JS高级学习路线——面向对象基础

比较传统和对象的编程方式 如何使用对象 定义两个工具包 /*产品工具包 - 保存和产品有关的工具*/ var product={ name:'iphone8', description:'各地区货源已陆续到库,我们将在十月十号左右发货,对于此次延迟发货给您带来的不便表示致歉,望您谅解.', price:6660, /*绑定元素*/ bindDom:function(){}, /*绑定事件*/ bindEvents:function(){}, /*立即购买,暂时不考虑里面的代码是如何写的*/ bu

CRL开发框架发布啦,一款面向对象的ORM业务框架

CRL是一个面向对象的轻便型ORM业务框架数据处理使用了对象/数据映射,数据操作采用Lamada表达式来表示,增加了可编程性和可靠性,出错机率低,同时也能用原生的SQL实现查询或操作数据连接以编程方式进行配置,支持多个数据库,参见Global.asax中实现,首次使用请更改LocalSqlHelper.CreateDbHelper中数据连接通过业务对象封装继承,实现业务重用性,比较常用的封装有,会员/账户系统,字典配置,分类系统,在线支付,订单/购物车,权限验证/菜单系统等等,当然也可以写自已的

CRL开发框架发布了,一款面向对象的ORM框架

CRL是一个面向对象的轻便型ORM业务框架数据处理使用了对象/数据映射,条件查询采用Lambda表达式来表示,增加了可编程性和可靠性,出错机率低,同时也能用原生的SQL实现查询或操作数据连接以编程方式进行配置,支持多个库,参见Global.asax中实现,首次使用请更改LocalSqlHelper.CreateDbHelper中数据连接通过业务对象封装继承,实现业务重用性,比较常用的封装有,会员/账户系统,字典配置,分类系统,在线支付,订单/购物车,权限验证/菜单系统等等,当然也可以写自已的业务

python第九课 面向对象

上周习题: 1.shape基类,要求所有子类都必须提供面积的计算,子类有三角形,矩形,圆,圆类的数据可序列化 2.用面向对象实现LinkedList链表,单向链表实现append,iternodes 3.双向链表实现append,pop,insert,remove,iternodes 答案: 1.shape类 import math import json import msgpack class Shape: @property def area(self): raise NotImpleme

python开发购物车

1 业务需求 商品中心 显示库存的商品 商品能够加入到购物车 个人中心 购物车 修改购物车的商品 下单 完成的订单 订单详情 账户余额 2 代码实现 1 # 定义全局变量信息 2 # 商品编号信息 3 goods_num = {'G1': '皮鞋', 'G2': '皮带', 'G3': '帽子', 'G4': '笔记本'} 4 # 商品单价 5 goods_price = {'皮鞋': 165, '皮带': 99, '帽子': 49, '笔记本': 3999} 6 # 购物车 7 shoppin