Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过模块模式制作子模块_Javascript_Design Patterns_Module Pattern - Fatal编程技术网

Javascript 如何通过模块模式制作子模块

Javascript 如何通过模块模式制作子模块,javascript,design-patterns,module-pattern,Javascript,Design Patterns,Module Pattern,我在读JavaScript模块模式。我的问题是如何用它生成子模块,也就是说,我如何从它继承,比如说我有这个类 var MODULE = (function () { my = function(){ this.params = "" }, privateVariable = 1; my.prototype.moduleMethod = function () { console.log("mod")

我在读JavaScript模块模式。我的问题是如何用它生成子模块,也就是说,我如何从它继承,比如说我有这个类

    var MODULE = (function () { 
    my = function(){
            this.params = ""
         }, 
    privateVariable = 1; 

    my.prototype.moduleMethod = function () {
        console.log("mod");
    }; 

    return my; 
}());

如何使用从父类继承的属性创建它的子类?如何对模块模式执行相同操作?

模块模式不是类模式。您不能简单地假装现在有JavaScript类。至于继承,如果您真的需要继承东西,您应该通过构造函数创建一个对象并使用原型继承,尽管它有时执行起来比较慢

至于创建子模块,它很简单

MODULE.submodule = (function(){
    // another module stuff that can even reference MODULE
    return { submodule: 'property' }
})();
现在,对于经典意义上的子类化,您可以在具有原型的对象上模拟它,就像Douglas Crockford所做的那样

为了用模块模拟它,您可以尝试在原始模块内创建密封/解封函数,并在子模块中使用它们。你可以在这里查一下 为了

克隆和遗传

var MODULE_TWO = (function (old) {
    var my = {},
        key;

    for (key in old) {
        if (old.hasOwnProperty(key)) {
            my[key] = old[key];
        }
    }

    var super_moduleMethod = old.moduleMethod;
    my.moduleMethod = function () {
        // override method on the clone, access to super through super_moduleMethod
    };

    return my;
}(MODULE))
或者

交叉-​文件优先级状态

var MODULE = (function (my) {
    var _private = my._private = my._private || {},
        _seal = my._seal = my._seal || function () {
            delete my._private;
            delete my._seal;
            delete my._unseal;
        },
        _unseal = my._unseal = my._unseal || function () {
            my._private = _private;
            my._seal = _seal;
            my._unseal = _unseal;
        };

    // permanent access to _private, _seal, and _unseal

    return my;
}(MODULE || {}));
如果my未使用var声明,则在函数执行时它将变为全局。此外,按照惯例,构造函数的名称以大写字母开头,因此:

      var My = function(){
但您也可以声明函数并完成它:

      function My() {

如果您只是实现原型继承,那么为什么要使用模块模式呢

> 
>     return my;  }());

模块模式不是为了继承,而是为了创建功能性的“模块”,并在某种程度上模拟公共、私有和私有成员。

Aha!第一个似乎很有希望。第二个看起来有点吓人:)请参阅Ben Cherry的文章了解更多细节:哦,正如RobG所指出的,始终对变量使用var,而不是ommit,记住它是函数范围的,而不是块范围的。
>             this.params = ""
>          }, 
>     privateVariable = 1; 
> 
>     my.prototype.moduleMethod = function () {
>         console.log("mod");
>     }; 
> 
>     return my;  }());