2015-11-11 106 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