Как использовать JSON для создания объекта, который наследуется от типа объекта? - PullRequest
12 голосов
/ 09 октября 2008

Я знаю, как использовать JSON для создания объектов, но, похоже, нет смысла использовать JSON для создания объекта определенного типа.

Вот пример объекта и создание его экземпляра:

Person = function() { };
Person.prototype = {
    FirstName: null,
    GetFirstName: function() {
        return this.FirstName;
    }
};

//Create an instance of the Person Object
var me = new Person();
me.FirstName = "Chris";
alert(me.GetFirstName()); //alert the FirstName property

Теперь я хотел бы использовать JSON для создания нового объекта Person, чтобы на нем работала функция GetFirstName.

Вот что я собираюсь сделать (но этот код не работает):

var you = new Person() { FirstName: "Mike" };
// OR
var you = new Person{ FirstName: "Mike" };

Есть ли способ использовать JSON для создания объекта определенного типа?

ОБНОВЛЕНИЕ: Мой пример с объектом Person просто для упрощения вопроса. На самом деле я не могу изменить конструкторы реальных объектов, которые мне нужны для создания экземпляров. Объекты являются частью сторонней библиотеки.

ОБНОВЛЕНИЕ: Используя некоторые из предложенных ниже советов, я смог найти способ создать объект, который наследуется от оригинала, и принять JSON в его конструкторе. Это аккуратно!

personWrapper = function(obj){
    for(var o in obj){
        this[o] = obj[o];
    }
};
personWrapper.prototype = new Person();

var you = new personWrapper({FirstName: "Chris"});
alert(you.GetFirstName());
alert(you instanceof Person); // returns True - we are successfully inheriting from Person!

Ответы [ 3 ]

13 голосов
/ 09 октября 2008

Я так не думаю. Я бы создал функцию класса Person для инициализации из объекта JSON, если бы вы были вами.

function Person() {
    this.loadFromJSON = function(json) {
        this.FirstName = json.FirstName;
    };
}

Если вы заранее не знали, какой класс представлял объект JSON, возможно, добавьте дополнительную переменную в ваш JSON.

{ _className : "Person", FirstName : "Mike" }

И затем есть функция 'builder', которая ее интерпретирует.

function buildFromJSON(json) {
    var myObj = new json["_className"]();
    myObj.loadFromJSON(json);
    return myObj;
}

Обновление: поскольку вы говорите, что класс является частью сторонней библиотеки, которую вы не можете изменить, вы можете либо расширить класс с помощью прототипирования, либо написать функцию, которая просто заполняет класс снаружи.

например:

Person.prototype.loadFromJSON = function(json) {
    // as above...
};

или

function populateObject(obj, json) {
    for (var i in json) {
        // you might want to put in a check here to test
        // that obj actually has an attribute named i
        obj[i] = json[i];
    }
}
4 голосов
/ 09 октября 2008

Вы можете разрешить new Person () принимать объект для заполнения атрибутов в качестве параметра.

var you = new Person({ firstName: 'Mike' });
2 голосов
/ 09 октября 2008

Вы можете получить объект из их. Ваш конструктор может принять нужный вам объект, но незаметно вызвать его конструктор:

function yourWrapper(obj) {
    theirObject.call(this);
    for (var s in obj) {
        this[s] = obj[s];
    }
}
yourWrapper.prototype = new theirObject();

Или что-то в этом роде:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...