2014-11-03 53 views
0

我有一個很奇怪的問題,通過使用命名空間來實例化一個對象。使用命名空間創建新對象

如果我嘗試這樣做,它不會工作:

this.myView = new this.getApp().Views.SubView({ // it doesn't work 
    initialize: function() { 
     console.log('bouh'); 
    } 
}); 

但是,如果我嘗試這樣做,它會工作:

this.myView = new (this.getApp().Views).SubView({ // it works 
    initialize: function() { 
     console.log('bouh'); 
    } 
}); 

你可以在這裏看到一個例子: http://jsfiddle.net/queval_j/a0yr41mn/

這種代碼已經被以前的工作,並且由於上週。我必須更新我的代碼,因爲這種新的行爲..所以,這是一個來自JS編譯器的問題,或者我從一段時間以來一直很幸運?

回答

1

這是所有在失敗行

this.myView = new this.getApp().Views.SubView({ // Doesn't work ?! 

新的運營商上this.getApp功能工作原理構造優先 ,並作爲構造函數試圖訪問成員「__pages」,這是在這裏爲null ,然後訪問子部件 'app' 將失敗

而在工作線路

this.myView = new(this.getApp().Views).SubView({ 

括號給出了this.getApp().Views優先於新的運營商,因此其被評估,然後再返回SubView然後由new操作

這可能利落的解決方法,就是以一個變量的this.getApp().Views值作爲構造處理像

var AppViews = this.getApp().Views; 

然後使用可變直接

this.myView = new AppViews.SubView({ 

jsFiddle updated

+0

我瞭解這種行爲,但爲什麼現在這樣工作? – 2014-11-03 12:20:41

+0

你是否在不同的瀏覽器上試過並獲得相同的行爲? – mfarouk 2014-11-03 12:35:04

+0

我查看了我以前做過的事情,的確,我在放圓括號。而且Firefox,Chrome和IE 11也有相同的行爲。 – 2014-11-03 12:49:08