节点通过构造器创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();