2016-09-22 7 views
0

申し訳ありませんが、タイトルはあまり明確ではありませんが、問題の場所はわかりません。JS:json、ダイナミックメソッドのクリーチャーとクロージャ

jsonからjsオブジェクトを作成する関数を書く必要があります。アンダースコアで始まるフィールドの場合は、セッターとゲッターを作成する必要があります。

これはテストJSONです:

var test1=jsonToObject(data); 
test1.setLanguage("11"); 
console.log("Point A:"+test1.getLanguage());//ouput 11 
var test2=jsonToObject(data); 
test2.setLanguage("22"); 
console.log("Point B:"+test2.getLanguage())//output 22 
console.log("Point C:"+test1.getLanguage());//output function (a){this[c]=a} 
console.log("Point D:"+test2.getLanguage())//output 22 

問題はC点である - :

{ 
"_language":null, 
"_country":null 
} 

これは、私はこれは私がそれをテストする方法です

function jsonToObject(json){ 
    return JSON.parse(json,function(key,value){ 
     if (value && typeof value === 'object') { 
      return (function(value){ 
       var replacement = {}; 
       for (var k in value) { 
        if (Object.hasOwnProperty.call(value, k)) { 
         //if this is private field 
         if (k.lastIndexOf("_", 0) === 0){ 
          replacement[k]=value[k]; 
          var name=k.substring(1); 
          var getName="get"+name.charAt(0).toUpperCase() + name.slice(1); 
          replacement.constructor.prototype[getName]=function(){ 
           return this[k]; 
          }; 
          var setName="set"+name.charAt(0).toUpperCase() + name.slice(1); 
          replacement.constructor.prototype[setName]=function(newValue){ 
           this[k]=newValue; 
          }; 
         //if this is public field 
         }else{ 
          replacement[k]=value[k]; 
         } 
        } 
       } 
       return replacement; 
      }(value)); 
     } 
     return value; 
    }); 
} 

を書いた関数であります出力は11でなければなりません。しかし、その出力は関数です...(このコードは最適化の後であり、そのためobfucatedに見えます)。私のミスはどこですか?

答えて

1

セッターとゲッターの重複は

function jsonToObject(json) { 
    return JSON.parse(json, function (key, value) { 
     if (value && typeof value === 'object') { 
      return (function (value) { 
       var replacement = {}; 
       for (var k in value) { 
        if (Object.hasOwnProperty.call(value, k)) { 
         //if this is private field 
         if (k.lastIndexOf("_", 0) === 0) { 
          replacement[k] = value[k]; 
          var name = k.substring(1); 
          var getName = "get" + name.charAt(0).toUpperCase() + name.slice(1); 
          // 
          // check defined 
          // 
          console.log(replacement.constructor.prototype[getName]); 
          // 
          // if defined function, prevent override 
          // 
          if (!/function/.test(typeof replacement.constructor.prototype[getName])) { 
           replacement.constructor.prototype[getName] = function() { 
            return this[k]; 
           }; 
          } 
          var setName = "set" + name.charAt(0).toUpperCase() + name.slice(1); 
          // check defined 
          console.log(replacement.constructor.prototype[setName]); 
          // if defined function, prevent override 
          if (!/function/.test(typeof replacement.constructor.prototype[setName])) { 
           replacement.constructor.prototype[setName] = function (newValue) { 
            this[k] = newValue; 
           }; 
          } 
          //if this is public field 
         } else { 
          replacement[k] = value[k]; 
         } 
        } 
       } 
       return replacement; 
      }(value)); 
     } 
     return value; 
    }); 
} 
+0

を定義したご提案をいただき、ありがとうございます。しかし、 'console.log(test1);を試してみてください。出力は' Object {_language:null、_country: "11"} 'になります。 –

+0

私は、このラッピング設定のセッターとゲッターを匿名関数で解決する問題を解決しました。 –

関連する問題