Javascript JSON.stringify没有正确处理原型?

时间:2014-02-12 15:32:57

标签: javascript json prototype

我一直在初始化我的可重用类(构造函数通常是一个复制构造函数):

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”]}

发生了什么事?

此处示例: http://jsfiddle.net/FdzB6/

2 个答案:

答案 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会爬上链,直到找到属性

第三部分: 您是直接在对象上设置属性而不是其原型