Javascript 如何通过模块模式制作子模块
我在读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")
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; }());