如何将继承的对象字符串化为JSON?

使用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它不会保留该对象的任何非拥有属性。您可以在此处查看有关其他缺陷和可能的解决方法的有趣讨论。

还要注意,作者不仅记录了问题,而且还编写了一个名为HydrateJS的库,该库可能会对您有所帮助。

这个问题比乍一看要深一些。即使a真正地字符串化为{"position":0,

"someVal":50},然后对其进行解析也会创建一个具有所需属性的对象,但该对象既不是Actor的实例,也不是指向WorldObject的原型链接(毕竟,parse方法没有这个信息,因此它不可能以这种方式还原它)。

为了保留原型链,需要一些巧妙的技巧(例如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将保持不变。

以上是 如何将继承的对象字符串化为JSON? 的全部内容, 来源链接: utcz.com/qa/403356.html

回到顶部