节点通过总结构创建实例

时间:2015-06-02 11:09:27

标签: javascript node.js class constructor instance

在尝试使用nodejs时,我遇到了通过Constructors创建isntances的问题。我创建简单的购物篮功能。 我有文件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')

但是如果我需要创建多个Cart实例呢?

我尝试重构我的代码,创建一个包含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属性为我的购物车添加功能和道具 所以我创建了第二个文件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;

现在它有效。 但是为了探索所有可能性,我想知道如何以我尝试的第一种方式解决它。当我可以将它作为“instanceble”类的东西和单独的东西,同时只有一个实例。

请您建议我如何以我想要的方式解决它? 如果您提供其他方法来解决创建可实现类的任务,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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();