2015-09-06 49 views
4
var RPGConfig = (function() { 
    var Constructor = function() { 
     this.dir = "js"; 
     this.enginedir = "js/Engine"; 
    }; 
    Constructor.prototype = { 
     include: [ 
      this.dir + "/Common.js", 
      this.dir + "/Common/Class.js" 
     ], 
     test: function() { 
      alert(this.dir); 
     } 
    }; 
    return Constructor; 
})(); 
rpgConfig = new RPGConfig(); 
rpgConfig.test(); 
console.log(rpgConfig.include); 

所以,如果我運行rpgConfig.test(),警報會彈出「js」。大!但是,我的rpgConfig.include顯示「undefined」,其中this.dir應該打印「js」(就像它在test()中所做的那樣)...(Javascript)對數組字面上的「this」進行說明

那麼,如何將「this」範圍添加到數組文字?

感謝

+1

也參見[在對象文本聲明自引用](http://stackoverflow.com/q/4616202/1048572) – Bergi

+1

陣列和對象文字沒有範圍。它們只是在一個函數範圍內,它負責'this'的值 - 在這種情況下是你的模塊IEFE。你必須在你的構造函數中移動它。 – Bergi

+0

完美的評論@Bergi。 – Vidul

回答

3

你根本不能,因爲原型是一個類的每個實例之間進行「共享」成員(及其descendency如果從來沒有覆蓋)。這意味着你必須將它包裝在一個函數中,以便爲你提供所需的東西。

Constructor.prototype = { 
    include: function() { 
     return [ 
      this.dir + "/Common.js", 
      this.dir + "/Common/Class.js" 
     ]; 
    }, 
    test: function() { 
     alert(this.dir); 
    } 
}; 
+0

非常好,謝謝! – user3780225

1

Constructor.prototype的賦值首先在構造函數之前進行評估。在其被評估的時候,構造函數已經聲明,但不能跑,所以this.dir值在那個時間未定。

test()函數工作的原因是因爲每次調用它時都會根據需要抓取值this.dir,因此在您調用它時,已經分配了this.dir