2016-04-23 61 views
0

我想建立一個能與那麼將使用由最終通過他們的結果原型的公共職能的一些私人功能的JSON文件被實例化的構造函數。這是正確的方法嗎?的JavaScript OOP私有函數

這裏更具體的代碼:

//constructor 
function queryArray(json){ 
    this.json = json; 

    //init qry template with default values 
    function qryInit() { 
     var qryTemplate = { 
      //some stuff 
     } 
     return qryTemplate; 
    } 

    //generate array of request templates 
    function qryTempArray(json){ 
     var template = qryInit(); 
     var qryTempArray1 = []; 
     for(var i = 0; i < json.length; i++){ 
      qryTempArray1.push({ 
       'SearchIndex': json[i].SearchIndex, 
       'Title': json[i].Title, 
       'Keywords': json[i].Keywords, 
       'MinimumPrice': json[i].MinimumPrice, 
       'MaximumPrice': json[i].MaximumPrice, 
       'ResponseGroup': template.ResponseGroup, 
       'sort': template.sort 
      }); 
     } 
     return qryTempArray1; 
    } 
} 

//function for finally building all the queries 
queryArray.prototype.qryBuilder = function(){ 
    var qryTempArray1 = []; 
    qryTempArray1 = qryTempArray(this.json); 
    //other stuff 
} 

如果我呼籲的對象的qryBuilder功能,我得到的功能qryTempArray錯誤 在json.length在for循環(不確定)。 這是爲什麼?

+0

你想實現依賴注入,還是什麼? –

+0

你錯過了大括號。編輯你的代碼 – RomanPerekhrest

+0

'query'拼寫單個* r *,構造函數的名字應該大寫,而實例應該小寫,缺少一個大括號,並且你可以改進縮進,但除此之外你的代碼是好的。 – Bergi

回答

0

正如代碼上面寫的,我很驚訝,你甚至到達循環。看起來你在調用qryBuilder()時會得到一個undefined。 我希望沿着以下幾條線來工作。

//constructor 
function queryArray(json) { 
    var self = this; 
    self.json = json; 

    //init qry template with default values 
    self.qryInit = function() { 
     var qryTemplate = { 
      //some stuff 
     } 
     return qryTemplate; 
    } 

    //generate array of request templates 
    self.qryTempArray = function(json) { 
     var template = self.qryInit(); 
     var qryTempArray1 = []; 
     for (var i = 0; i < json.length; i++) { 
      qryTempArray1.push({ 
       'SearchIndex': json[i].SearchIndex, 
       'Title': json[i].Title, 
       'Keywords': json[i].Keywords, 
       'MinimumPrice': json[i].MinimumPrice, 
       'MaximumPrice': json[i].MaximumPrice, 
       'ResponseGroup': template.ResponseGroup, 
       'sort': template.sort 
      }); 
     } 
     return qryTempArray1; 
    } 
    return self; 
} 
queryArray.prototype.qryBuilder = function() { 
    var qryTempArray1 = []; 
    qryTempArray1 = this.qryTempArray(this.json); 
    return qryTempArray1; 
} 
var q = new queryArray([{ 
    'SearchIndex': 0, 
    'Title': 'foo', 
    'Keywords': 'testing', 
    'MinimumPrice': 20, 
    'MaximumPrice': 40 
}]); 
console.log(q); 
console.log(q.qryBuilder()); 
+0

我理解正確嗎?爲了解決這個問題,我需要一個特權功能? – Hucho

+0

從您的原始代碼中,我看不到您的原型函數將如何訪問qryTempArray()。在原型上定義的函數沒有在queryArray的構造函數的作用域中定義,並且不能訪問構造函數的本地\ private變量 – scottjustin5000

+0

這正是我錯誤的地方。我認爲原型的功能共享構造函數的範圍以及私有變量和函數。謝謝!但還有一個問題。如果我以一種在原型中定義每個函數的方式來更改我的代碼,那麼它在沒有這個/ self的情況下工作......爲什麼如果原型函數不共享構造函數? – Hucho