使用 JSON.stringify() 时,json2.js 似乎忽略了父对象的成员。例子:
require('./json2.js');
function WorldObject(type) {
this.position = 4;
}
function Actor(val) {
this.someVal = 50;
}
Actor.prototype = new WorldObject();
var a = new Actor(2);
console.log(a.position);
console.log(JSON.stringify(a));
输出是:
4
{"someVal":50}
我期望这个输出:
4
{"position":0, "someVal":50}
嗯,事情就是这样,JSON.stringify
不保留对象的任何非拥有属性。您可以查看有关其他缺点和可能的解决方法的有趣讨论here.
另请注意,作者不仅记录了问题,还编写了一个名为水合物JS这可能对你有帮助。
这个问题比乍一看要更深一些。即使a
真的会字符串化为{"position":0, "someVal":50}
,然后稍后解析它会创建一个具有所需属性的对象,但它既不是 Actor 的实例,也没有到 WorldObject 的原型链接(毕竟,解析方法没有此信息,所以它可以'不可能那样恢复它)。
为了保留原型链,需要巧妙的技巧(就像 HydrateJS 中使用的那样)。如果这不是您的目标,也许您只需要在字符串化对象之前“压平”对象即可。为此,您可以例如迭代对象的所有属性,无论它们是否是自己的,并重新分配它们(这将确保它们在对象本身上定义,而不是仅仅从原型继承)。
function flatten(obj) {
var result = Object.create(obj);
for(var key in result) {
result[key] = result[key];
}
return result;
}
函数的编写方式不会改变原始对象。所以使用
console.log(JSON.stringify(flatten(a)));
你会得到你想要的输出a
将保持不变。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)