节点通过构造器创build实例

在尝试使用nodejs时,遇到了通过构造函数创buildisntances的问题。 我创build简单的购物车function。 我有文件cart.js

var items = []; function addItem (name, price) { items.push({ name: name, price: price }); } exports.total = function () { return items.reduce(function (a,b) { return a + b.price; }, 0); }; exports.addItem = addItem; 

我用节点运行它

 var cart = require('./cart') 

但是,如果我需要创build一个Cart的多个实例呢?

我试图重构我的代码,创build一个构造函数,它包含items[] addItem() and total()函数,如下所示:

  exports.Cart = function () { var items = []; function addItem (name, price) { items.push({ name: name, price: price }); } function total () { return items.reduce(function (a,b) { return a + b.price; }, 0); } }; 

我像这样运行它:

 var cart = require('./cart'); cart.addItem('Pepsi',199); // no problem with this cart2 = new cart.Cart(); // it gives me undefined can't be a function 

我明白,我可以使用PROTOTYPE属性添加function和道具到我的购物车所以,我创build了第二个文件cart2.js和类似的地方:

  function Cart () { this.items = []; } Cart.prototype.addItem = function (name, price) { this.items.push({ name: name, price: price }); }; Cart.prototype.total = function () { return this.items.reduce(function (a,b) { return a + b.price; }, 0); }; module.exports = Cart; 

现在它工作。 但为了探索所有的可能性,我想知道如何以我尝试的第一种方式解决这个问题。 当我可以用它作为“实例化”类的东西,并作为单例的东西,同时只有一个实例。

你能请教我如何以我想要的方式来解决它? 如果您提供其他方法来解决创build可实例化类的任务,我将不胜感激。

第一个选项可能如下所示:

 exports.Cart = function () { var items = []; // ...other private stuff... return { addItem: function (name, price) { items.push({ name: name, price: price }); }, total: function() { return items.reduce(function (a,b) { return a + b.price; }, 0); } // ...other public stuff... } }; 

用法:

  var carts = require('carts'); firstCart = carts.Cart(); second = carts.Cart();