繁体   English   中英

JavaScript JSON.stringify无法正确处理原型吗?

[英]Javascript JSON.stringify doesn't handle prototype correctly?

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

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);

{“ a”:“ 1”,“ b”:“ 2”,“ c”:[“ 3”]}

如果在构造函数中定义了变量,它也可以正常工作:

function Alt() {
    this.a = 1;
    this.b = "2";
    this.c = [];
}
JSON.stringify(obj);

{“ a”:1,“ b”:“ 2”,“ c”:[“ 3”]}

这是怎么回事?

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

通过引用对象可以读取对象原型(即其构造函数的原型)上的属性:

function Constructor() { }
Constructor.prototype.a = "hello world";

var x = new Constructor();
alert(x.a); // "hello world"

但是,这些属性确实“卡在”原型对象上:

alert(x.hasOwnProperty("a")); // false

JSON序列化程序仅关注直接出现在正在处理的对象上的属性。 这有点痛苦,但是如果您考虑反向过程,这有点道理:您当然不希望JSON.parse()将属性放回到原型上(无论如何还是很棘手的)。

您的答案在于, 为什么JSON.stringify不序列化原型值?

JSON.stringify仅具有“自有”属性。

在第一个示例中:设置原型成员,然后对不具有自己属性的对象本身调用Stringify

在您的第二个中: this.a将爬链直到找到该物业

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM