很抱歉标题不是很明确,但我不知道问题出在哪里。
所以,我需要编写一个从json创建js对象的函数,对于以下划线开头的字段,它必须创建setter和getter。
这是测试json:
{
"_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;
});
}
这是我测试它的方式:
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点 - 输出必须是11.但是它的输出是函数...(这段代码是在优化之后,这就是为什么它看起来很有瑕疵)。我的错误在哪里?
答案 0 :(得分:1)
setter和getter重复定义
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;
});
}