【问题标题】:node creating instances via costructors节点通过 costructors 创建实例
【发布时间】:2015-08-16 03:29:47
【问题描述】:

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

但是如果我需要创建多个购物车实例怎么办?

我尝试重构我的代码,创建一个包含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;

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

您能否建议我如何按照我最初想要的方式解决它? 如果您提供一些其他方法来解决创建可实例类的任务,我将不胜感激。

【问题讨论】:

    标签: javascript node.js class constructor instance


    【解决方案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();
    

    【讨论】:

    • 谢谢,乔治!我不知道这种方式。现在我已经具备了这个。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多