Javascript JSON.stringify不';不能正确处理原型?

Javascript JSON.stringify不';不能正确处理原型?,javascript,json,prototype,Javascript,Json,Prototype,我一直在像这样初始化我的可重用类(构造函数通常是一个复制构造函数): 但是JSON.stringify不会产生预期的结果: JSON.stringify(obj); {} 变量的工作方式与预期的一样。 如果toJSON被重写,它可以正常工作: Foo.prototype.toJSON = function () { return { a: this.a, b: this.b, c: this.c }; }; JSON.string

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

但是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 Foo() {}
Foo.prototype.a = "1";
Foo.prototype.b = "2";
Foo.prototype.c = [];
var obj = new Foo();
obj.c.push("3");
function Alt() {
    this.a = 1;
    this.b = "2";
    this.c = [];
}
JSON.stringify(obj);
{“a”:1,“b”:“2”,“c”:[“3”]}

发生什么事了

示例如下:

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

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

var x = new Constructor();
alert(x.a); // "hello world"
但是,这些属性实际上“卡在”原型对象上:

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

JSON序列化程序只关注直接出现在正在处理的对象上的属性。这有点痛苦,但如果你考虑一下相反的过程,它会有一点意义:你肯定不希望
JSON.parse()
将属性放回到原型上(这无论如何都是相当棘手的)。

你的答案是错误的

stringify只“拥有”属性

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

在你的第二份报告中:
此。a
将爬升链,直到找到属性

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

JSON序列化程序只关注被序列化对象上的直接属性(“自己的”属性)。@MikeEmery代表“Foo”,函数?!?不,函数“Foo”没有这些属性,通过调用
new Foo
创建的对象也没有这些属性-当然,它们可以通过实例从原型中读取,但是
hasOwnProperty(“a”)
测试将返回
false
@RocketHazmat yes;简单的字符串或数值原型属性与函数属性之间实际上没有区别。属性引用的查找过程是相同的。我想我应该补充一个答案:)作为参考,下面是如何实现Crockford的stringify:@MikeEmery好吧,这取决于你想做什么。如果用JSON序列化对象的能力真的很重要,那么是的,我会说这是个坏主意:)谢谢你的解释——后面关于使用JSON.parse的部分特别有用。