Разобрать строку JSON в прототип конкретного объекта в JavaScript - PullRequest
151 голосов
/ 03 мая 2011

Я знаю, как разобрать строку JSON и превратить ее в объект JavaScript. Вы можете использовать JSON.parse() в современных браузерах (и IE9 +).

Это здорово, но как я могу взять этот объект JavaScript и превратить его в конкретный объект JavaScript (т.е. с определенным прототипом)?

Например, предположим, что у вас есть:

function Foo()
{
   this.a = 3;
   this.b = 2;
   this.test = function() {return this.a*this.b;};
}
var fooObj = new Foo();
alert(fooObj.test() ); //Prints 6
var fooJSON = JSON.parse({"a":4, "b": 3});
//Something to convert fooJSON into a Foo Object
//....... (this is what I am missing)
alert(fooJSON.test() ); //Prints 12

Опять же, мне не интересно, как преобразовать строку JSON в общий объект JavaScript. Я хочу знать, как преобразовать строку JSON в объект "Foo". То есть мой объект теперь должен иметь функцию 'test' и свойства 'a' и 'b'.

UPDATE Проведя некоторое исследование, я подумал об этом ...

Object.cast = function cast(rawObj, constructor)
{
    var obj = new constructor();
    for(var i in rawObj)
        obj[i] = rawObj[i];
    return obj;
}
var fooJSON = Object.cast({"a":4, "b": 3}, Foo);

Будет ли это работать?

ОБНОВЛЕНИЕ Май, 2017 : «Современный» способ сделать это - Object.assign, но эта функция недоступна в браузерах Android 11 и более ранних версий.

Ответы [ 12 ]

0 голосов
/ 03 марта 2016

Ответы Оливера очень ясны, но если вы ищете решение в angular js, я написал хороший модуль под названием Angular-jsClass, который облегчает эту задачу, поскольку объекты, определенные в литеральной нотации, всегда плохи, когда вы стремитесь к большой проект, но говорят, что разработчики сталкиваются с проблемой, о которой точно сказал BMiner, как сериализовать json для прототипа или конструктора нотационных объектов

var jone = new Student();
jone.populate(jsonString); // populate Student class with Json string
console.log(jone.getName()); // Student Object is ready to use

https://github.com/imalhasaranga/Angular-JSClass

0 голосов
/ 03 декабря 2014

Хотя технически это не то, что вам нужно, если вы заранее знаете тип объекта, с которым хотите работать, вы можете использовать методы call / apply прототипа вашего известного объекта.

вы можетеизменить это

alert(fooJSON.test() ); //Prints 12

на это

alert(Foo.prototype.test.call(fooJSON); //Prints 12
...