1

我正在尝试使用 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 代码中的其他功能或区域中调用它。我感谢所有帮助!

4

2 回答 2

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被省略的测试。

于 2012-12-09T22:40:08.240 回答
0

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

于 2012-12-09T23:12:40.883 回答