2016-04-23 4 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関数を呼び出す場合、私は、forループ(未定義)でjson.lengthでの関数qryTempArrayにエラー を取得します。 なぜですか?

+0

あなたは依存性注入を達成しようとしていますか? –

+0

あなたは中かっこを閉じていませんでした。コードを編集します – RomanPerekhrest

+0

'query'は単一の* r *で綴られていますが、コンストラクタの名前は大文字にする必要があります。インスタンスは小文字でなければならず、閉じ括弧がなく、インデントを改善できます。 – Bergi

答えて

0

コードが上記のように書かれているので、私はループに遭遇することにも驚いています。あなたが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のコンストラクタのスコープ内で定義されておらず、コンストラクタのローカル\プライベート変数へのアクセスを持たない – scottjustin5000

+0

これは私が間違っていた場所です。私は、プロトタイプの機能は、コンストラクタの範囲と私的な変数と機能を共有していると思った。ありがとうございました!しかしもう一つの質問。私はすべての関数がプロトタイプで定義されているように自分のコードを変更すると、これは/ self ...では動作しません。なぜプロトタイプ関数がコンストラクタの分担を共有しないのでしょうか? – Hucho

関連する問題