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に見えます)。私のミスはどこですか?
を定義したご提案をいただき、ありがとうございます。しかし、 'console.log(test1);を試してみてください。出力は' Object {_language:null、_country: "11"} 'になります。 –
私は、このラッピング設定のセッターとゲッターを匿名関数で解決する問題を解決しました。 –