【发布时间】:2014-02-12 15:32:56
【问题描述】:
我一直在像这样初始化我的可重用类(构造函数通常是复制构造函数):
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/
【问题讨论】:
-
JSON 序列化器只关注被序列化对象上的属性(“自己的”属性)。
-
@MikeEmery 代表“Foo”,函数?!?不,函数 "Foo" 没有这些属性,通过调用
new Foo创建的对象也不会 - 当然,它们将通过实例从原型中可读,但是hasOwnProperty("a")测试将返回false。 -
@RocketHazmat 是的;简单的字符串或数值原型属性与函数属性之间实际上没有区别。属性引用的查找过程是相同的。我想我应该添加一个答案:)
-
作为参考,这里是 Crockford 的 stringify 的实现方式:github.com/douglascrockford/JSON-js/blob/master/json2.js#L326
-
@MikeEmery 好吧,这取决于您要做什么。如果使用 JSON 序列化对象的能力真的很重要,那么是的,我会说这是个坏主意 :)
标签: javascript json prototype