我正在阅读有关JavaScript模块模式的内容。我的问题是我如何使用它制作子模块,即如何从中继承它,说我有这个类
var MODULE = (function () {
my = function(){
this.params = ""
},
privateVariable = 1;
my.prototype.moduleMethod = function () {
console.log("mod");
};
return my;
}());
如何使用从父级继承的属性创建子类?如何对模块模式进行相同的操作?
答案 0 :(得分: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 || {}));
答案 1 :(得分:1)
> var MODULE = (function () {
> my = function(){
如果我的未使用var声明,则在函数执行时它变为全局。此外,按照惯例,构造函数的名称以大写字母开头,所以:
var My = function(){
但您也可以声明该功能并完成它:
function My() {
> this.params = ""
> },
> privateVariable = 1;
>
> my.prototype.moduleMethod = function () {
> console.log("mod");
> };
如果您只是实现原型继承,为什么要使用模块模式?
>
> return my; }());
模块模式不是用于继承,而是用于创建功能的“模块”,并在某种程度上模拟公共,私有和私有成员。