3

我正在阅读有关 JavaScript 模块模式的信息。我的问题是如何用它制作子模块,即我如何从它继承,比如我有这个类

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

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

    return my; 
}());

如何使用从父级继承的属性创建它的子类?我怎样才能对模块模式做同样的事情?

4

2 回答 2

7

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

至于创建子模块很简单

MODULE.submodule = (function(){
    // another module stuff that can even reference MODULE
    return { submodule: 'property' }
})();

现在,至于经典意义上的子类化,您可以在具有原型的对象上模拟它,就像 Douglas Crockford 所做的那样http://www.crockford.com/javascript/inheritance.html

为了用模块模拟它,您可以尝试在原始模块中创建一个密封/解封函数并在您的子模块中使用它们。您可以在此处 查看http://www.pallavlaskar.com/javascript-module-pattern-in-details/

克隆和继承

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 || {}));
于 2011-09-22T02:43:56.293 回答
1
>     var MODULE = (function () { 
>     my = function(){

如果my没有用 var 声明,则在函数执行时它变成全局的。此外,按照惯例,构造函数的名称以大写字母开头,因此:

      var My = function(){

但你也可以只声明函数并完成它:

      function My() {

.

>             this.params = ""
>          }, 
>     privateVariable = 1; 
> 
>     my.prototype.moduleMethod = function () {
>         console.log("mod");
>     }; 

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

> 
>     return my;  }());

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

于 2011-09-22T02:47:45.927 回答