2016-04-23 2 views
0

Я хотел бы создать конструктор, который может быть создан с помощью json-файла, который затем используется некоторыми частными функциями, которые в конце передают свои результаты публичной функции прототипа. Правильно ли это?Javascript OOP private functions

Вот более конкретный код:

//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 в течение цикла (не определено). Зачем?

+0

Вы пытаетесь достичь инъекции зависимости, или что? –

+0

вы пропустили закрытие фигурного скобки. Редактируйте свой код – RomanPerekhrest

+0

'query' пишется с одним * r *, имена конструкторов должны быть заглавными, а экземпляры должны быть строчными, отсутствует закрывающая скобка, и вы можете улучшить отступы, но кроме этого ваш код в порядке. – Bergi

ответ

0

Поскольку код написан выше, я удивлен, что вы даже попадаете в цикл. Казалось бы, вы получите undefined при вызове qryBuilder(); Я бы ожидал, что что-то будет выглядеть следующим образом:

//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

Именно в этом я и ошибался. Я думал, что функции прототипа разделяют объем конструктора, а также частные переменные и функции. Спасибо! Но еще один вопрос. Если я изменю свой код таким образом, чтобы каждая функция была определена на прототипе, она работает без этого/я ... почему это может быть, если прототип-функции не разделяют возможности конструктора? – Hucho

 Смежные вопросы

  • Нет связанных вопросов^_^