2015-11-11 80 views
-1

的Javascript宽松augumentation因为我想实现这样的事情:模块化模式

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对象(如果存在),或者是一个空对象。

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

我做错了什么?

谢谢!

回答

0

你的问题是双重的。

1)在甚至引用它之前(即使将变量保留为undefined),您需要在某处声明您的APP变量。要么,要么您可以使用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值。

我不完全确定这是什么模式,你试图在这里代表(古典继承?),但这个修复应该有希望让你前进。

+0

谢谢!这按预期工作!我只是尝试不同的方法来JS模块模式我猜。我还没有完全理解,但我试图每天写更好的代码。 – musicvicious

1

您无法对未声明的变量进行引用。 APP || {}的整点是为了获得空对象的值,因为声明了APP并且是伪造的(它可以是0,undefined,false,NaN ...)。如果它有可能是未申报的,你应该使用typeof运算符来检查它:

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

或者只是在使用它之前声明它:'var APP;' – shennan

+0

@shennan不,这会影响任何以前的APP变量,并保证它永远是虚假的。这种情况的出现大概是因为有一些脚本修改机制(可能是服务器端脚本)注入声明。 – sahbeewah

+0

我仍然得到'未捕获的ReferenceError:APP未定义'如果我console.log(APP)。 APP应该包含Module1和Module2 – musicvicious