我一直在初始化我的可重用类(构造函数通常是一个复制构造函数):
function Foo() {}
Foo.prototype.a = "1";
Foo.prototype.b = "2";
Foo.prototype.c = [];
var obj = new Foo();
obj.c.push("3");
但是JSON.stringify不会产生预期的结果:
JSON.stringify(obj);
{}
变量对其他一切都有预期效果 如果toJSON被覆盖,它可以正常工作:
Foo.prototype.toJSON = function () {
return {
a: this.a,
b: this.b,
c: this.c
};
};
JSON.stringify(obj);
{ “一个”: “1”, “B”: “2”, “C”:[ “3”]}
如果在构造函数中定义变量,它也可以正常工作:
function Alt() {
this.a = 1;
this.b = "2";
this.c = [];
}
JSON.stringify(obj);
{ “一”:1, “B”: “2”, “C”:[ “3”]}
发生了什么事?
答案 0 :(得分:2)
对象原型的属性(即其构造函数的原型)通过对对象的引用可读:
function Constructor() { }
Constructor.prototype.a = "hello world";
var x = new Constructor();
alert(x.a); // "hello world"
然而,这些属性确实“卡在”原型对象上:
alert(x.hasOwnProperty("a")); // false
JSON序列化程序仅关注直接出现在正在处理的对象上的属性。这有点痛苦,但是如果你考虑相反的过程就会有点意义:你当然不希望JSON.parse()
将属性放回到原型上(无论如何都会非常棘手)。
答案 1 :(得分:1)
你的回答是Why is JSON.stringify not serializing prototype values?
JSON.stringify只执行“拥有”属性。
在你的第一个例子中:
正在设置原型成员,然后在对象本身上调用Stringify
,该对象本身没有自己的属性。
在你的第二个:
this.a
会爬上链,直到找到属性
第三部分: 您是直接在对象上设置属性而不是其原型