Точно также продолжая твою мысль:
//сделав так
var cart = new Cart(oldCart);
//получишь
cart = {
items: oldCart.items || {};
totalQty: oldCart.totalQty || 0;
totalPrice: oldCart.totalPrice || 0;
add: function(item, id) {
var storedItem = this.items[id];
if (!storedItem) {
storedItem = this.items[id] = {item: item, qty: 0, price: 0};
}
storedItem.qty++;
storedItem.price = storedItem.item.price * storedItem.qty;
this.totalQty++;
this.totalPrice += storedItem.item.price;
},
reduceByOne: function(id) {
this.items[id].qty--;
this.items[id].price -= this.items[id].item.price;
this.totalQty--;
this.totalPrice -= this.items[id].item.price;
if (this.items[id].qty <= 0) {
delete this.items[id];
}
}
}
//и сможешь вызывать "методы" полученного объекта так:
cart.reduceByOne('id');
В js нет значения что и куда ты пихаешь, функции точно такие же объекты как и всё остальное.
P.S. Вообще код не правильный, т.к. каждый объект получит свои функции в качестве псевдометодов. Чтобы методы были настоящими(едины для всех созданных объектов) - надо добавлять их в прототип:
function Cart(oldCart) {
this.items = oldCart.items || {};
this.totalQty = oldCart.totalQty || 0;
this.totalPrice = oldCart.totalPrice || 0;
}
Cart.prototype.add = function(item, id) {
var storedItem = this.items[id];
if (!storedItem) {
storedItem = this.items[id] = {item: item, qty: 0, price: 0};
}
storedItem.qty++;
storedItem.price = storedItem.item.price * storedItem.qty;
this.totalQty++;
this.totalPrice += storedItem.item.price;
};
Cart.prototype.reduceByOne = function(id) {
this.items[id].qty--;
this.items[id].price -= this.items[id].item.price;
this.totalQty--;
this.totalPrice -= this.items[id].item.price;
if (this.items[id].qty <= 0) {
delete this.items[id];
}
};
module.exports = Cart;