Как JSON.stringify пользовательский класс в Javascript? - PullRequest
3 голосов
/ 09 сентября 2011

JSON.stringify () работает с литеральными объектами, такими как:

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

myObjectLiteralSerialized назначен, "{" А ":" 1а " "б": "1b", "С": 100, "г": { "да": "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 без написания нескольких пользовательских кодов?

1 Ответ

12 голосов
/ 09 сентября 2011

Ваш 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...