在Javascript中创建和使用模块

时间:2012-12-09 22:32:39

标签: javascript module

我试图在Javascript中获取现有对象并将其重写为模块。下面是我尝试重写为模块的代码:

var Queue = {};
Queue.prototype = {
    add: function(x) {
        this.data.push(x);
    },
    remove: function() {
        return this.data.shift();
    }
};
Queue.create = function() {
    var q = Object.create(Queue.prototype);
    q.data = [];
    return q;
};         

这是我尝试制作模块:

var Queue = (function() {

    var Queue = function() {};

    // prototype
    Queue.prototype = {
        add: function(x) {
            this.data.push(x);
        },
        remove: function() {
            return this.data.shift();
        }
    };

    Queue.create = function() {
        var q = Object.create(Queue.prototype);
        q.data = [];
        return q;
    };


    return Queue;
})();

这是对的吗?如果是,我如何在我的js代码中的其他函数或区域中调用它。我感谢所有的帮助!

2 个答案:

答案 0 :(得分:1)

拥有一个空的构造函数似乎有点无意义,然后在该构造函数上使用一个属性作为一个有效的构造函数。

为什么不利用构造函数......

var Queue = (function() {

    var Queue = function() {
        if (!(this instanceof Queue))
            return new Queue();

        this.data = [];
    };

    Queue.prototype = {
        add: function(x) {
            this.data.push(x);
        },
        remove: function() {
            return this.data.shift();
        }
    };

    return Queue;
})();

或者,如果您更喜欢使用Object.create,我会这样做:

var Queue = (function() {

    var Queue = function() {
        var o = Object.create(proto);

        o.data = [];

        return o;
    };

    var proto = {
        add: function(x) {
            this.data.push(x);
        },
        remove: function() {
            return this.data.shift();
        }
    };

    return Queue;
})();

在这两种情况下,您只需使用Queue来创建新对象。

var q = Queue();

从技术上讲,第一个应该使用new Queue(),但它有instanceof测试以允许new被省略。

答案 1 :(得分:0)

如果您尝试模块化代码,请尝试ConversationJS。它允许您通过转义传统函数调用来保持代码库的极度分离: https://github.com/rhyneandrew/Conversation.JS