javascript - JS: json, dynamic method creature and closure -
sorry not clear title,but don't know problem is.
so, need write function creates js objects json , fields begins underscore must create setters , getters.
this test json:
{ "_language":null, "_country":null }
this function wrote
function jsontoobject(json){ return json.parse(json,function(key,value){ if (value && typeof value === 'object') { return (function(value){ var replacement = {}; (var k in value) { if (object.hasownproperty.call(value, k)) { //if 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 public field }else{ replacement[k]=value[k]; } } } return replacement; }(value)); } return value; }); }
this how test it:
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
the problem @ point c - output must 11. output function... (this code after optimization, that's why looks obfucated). mistake?
setter , getter duplicate defined
function jsontoobject(json) { return json.parse(json, function (key, value) { if (value && typeof value === 'object') { return (function (value) { var replacement = {}; (var k in value) { if (object.hasownproperty.call(value, k)) { //if 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 public field } else { replacement[k] = value[k]; } } } return replacement; }(value)); } return value; }); }
Comments
Post a Comment