Javascript松散的模块化模式

时间:2015-11-11 11:46:08

标签: javascript

因为我想要达到这样的目的:

var SomeModule = (function(parent) {
    var self = parent.Module1 = parent.Module1 || {};
    self.public_property1 = [];
    self.publicMethod1 = function() {
        // something here in the Module2
    }

    return parent;

}(APP || {}));

var SomeOtherModule = (function(parent) {
    var self = parent.Module2 = parent.Module2 || {};
    self.public_property2 = [];
    self.publicMethod2 = function() {
        // something here
    }

    return parent;

}(APP || {}))

我得'Uncaught ReferenceError: APP is not defined' 但那是APP || {}的重点,不是吗?据我所知,parent参数必须包含APP对象(如果存在),或者是一个空对象。

我想要的是包含Module1,Module2和任何其他模块的APP对象。

我做错了吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您无法引用未声明的变量。 APP || {}的重点是获取空对象值,因为APP是声明的并且是假的(它可以是0,未定义,假,NaN ......)。如果它可能是未声明的,您应该使用typeof运算符来检查它:

(function () { ... })(typeof APP !== 'undefined' ? APP : {})

答案 1 :(得分:0)

你的问题是双重的。

1)您需要在引用它之前在某处声明APP变量(即使您将变量保留为undefined)。或者,或者您可以使用typeof运算符,该运算符在未声明变量时不会抛出错误。

2)当您在{}的第一个实例中动态创建对象(SomeModule)时,您实际上并没有保存它的引用回到APP变量,你似乎想重新使用它来进行SomeOtherModule的第二次实例化。

这是一个固定版本:



var APP = (function(parent) {
    var self = parent.Module1 = parent.Module1 || {};
    self.public_property1 = [];
    self.publicMethod1 = function() {
        // something here in the Module2
    }

    return parent;

})(APP || {});

APP = (function(parent) {
    var self = parent.Module2 = parent.Module2 || {};
    self.public_property2 = [];
    self.publicMethod2 = function() {
        // something here
    }

    return parent;

})(APP || {});

console.log(APP);




正如您在控制台输出中看到的那样,APP变量现在包含Module1Module2值。

我不完全确定你在这里尝试代表什么样的模式(经典继承?),但是这个修复应该会让你继续前进。