【问题标题】:How to JSON.stringify a user-defined class in Javascript?如何 JSON.stringify Javascript 中的用户定义类?
【发布时间】:2011-09-09 02:59:13
【问题描述】:

JSON.stringify() 适用于文字对象,例如:

var myObjectLiteral = {
    a : "1a",
    b : "1b",
    c : 100,
    d : {
        da : "1da",
        dc : 200
    }
};
var myObjectLiteralSerialized = JSON.stringify(myObjectLiteral); 

myObjectLiteralSerialized 已分配, "{"a":"1a","b":"1b","c":100,"d":{"da":"1da","dc":200}}" 正如预期的那样。

但是,如果我用这样的 ctor 定义类,

    function MyClass() {
    var a = "1a";
    var b = "1b";
    var c = 100;
    var d = {
        da : "1da",
        dc : 200
    };
};


var myObject = new MyClass;
var myObjectSerialized = JSON.stringify(myObject);

然后将 myObjectSerialized 设置为空字符串“”。

我认为原因是因为类版本最终成为实例化类的原型,这使得它的属性为原型“拥有”,而 JSON 只会对实例对象 myObject 拥有的道具进行字符串化。

有没有一种简单的方法可以将我的类转换为 JSON 字符串而无需编写大量自定义代码?

【问题讨论】:

  • 那些不是属性,而是局部变量。
  • 另外,函数声明没有尾随分号。

标签: javascript json serialization


【解决方案1】:

您的MyClass 没有在正在构造的对象上设置任何属性。它只是为构造函数创建局部变量。

要创建属性,请在构造函数中为this 设置属性,因为this 引用了新对象:

function MyClass() {
    this.a = "1a";
    this.b = "1b";
    this.c = 100;
    this.d = {
        da : "1da",
        dc : 200
    };
}

此外,您通常不会向构造函数内部.prototype 对象添加属性。它们只需要添加一次,并且将在构造函数创建的对象之间共享。

function MyClass() {
    this.a = "1a";
    this.b = "1b";
    this.c = 100;
    this.d = {
        da : "1da",
        dc : 200
    };
}

MyClass.prototype.toJSON = function() {
    return; // ???
}
MyClass.prototype.equals = function(other) {
    if(other != null && other.prototype == this) {
        if(this.a == other.a
            && this.b == other.b
            && this.c == other.c
            && this.d.da == other.d.da
            && this.d.dc == other.d.dc)
            return true;
    }
    return false;
}

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多