8

我想编写一个 JS 库并像这样处理它:

var c1 = Module.Class();
c1.init();
var c1 = Module.Class();
c2.init();

当然,c1 和 c2 不能共享相同的变量。我想我知道如何用对象做到这一点,它会是:

var Module = {

     Class = {

         init = function(){
             ...
         }

     }

}

但问题是,如果我以这种方式编写,我就不能拥有多个 Class 实例。所以我试图用函数实现同样的效果,但我认为我做得不对。

(function() {

    var Module;
    window.Module = Module = {};

    function Class( i ) {
        //How can "this" refer to Class instead of Module?
        this.initial = i;
    }

    Class.prototype.execute = function() {
        ...
    }

    //Public
    Module.Class = Class;

})();

我不知道它是否可能,但我接受其他方式来创建这个模块的建议。我不知道它是否也相关,但我在这个库中使用 jQuery。

4

1 回答 1

14

用法:

var c1 = Module.Class("c");
var c2 = Module.Class("a");
var n = c1.initial(); // equals 'c'
c1.initial("s");
n = c1.initial(); // equals 's'

模块代码:

(function(window) {
    var Module = window.Module = {};
    var Class = Module.Class = function(initial)
    {
        return new Module.Class.fn.init(initial);
    };
    Class.fn = Class.prototype = {
        init: function(initial) {
            this._initial = initial;
        },
        initial: function(v){
            if (v !== undefined) {
                this._initial = v;
                return this;
            }
            return this._initial;
        }
    };
    Class.fn.init.prototype = Class.fn;
})(window || this);

这是使用 JavaScript“模块”设计模式;这与 jQuery 等 JavaScript 库使用的设计模式相同。

这是关于“模块”模式的一个很好的教程: JavaScript 模块模式:深入

于 2011-09-24T18:48:49.117 回答