Parse JSON String into a Particular Object Prototype in JavaScript
The current answers contain a lot of hand-rolled or library code. This is not necessary.
Use
JSON.parse('{"a":1}')
to create a plain object.Use one of the standardized functions to set the prototype:
Object.assign(new Foo, { a: 1 })
Object.setPrototypeOf({ a: 1 }, Foo.prototype)
See an example below (this example uses the native JSON object). My changes are commented in CAPITALS:
function Foo(obj) // CONSTRUCTOR CAN BE OVERLOADED WITH AN OBJECT{ this.a = 3; this.b = 2; this.test = function() {return this.a*this.b;}; // IF AN OBJECT WAS PASSED THEN INITIALISE PROPERTIES FROM THAT OBJECT for (var prop in obj) this[prop] = obj[prop];}var fooObj = new Foo();alert(fooObj.test() ); //Prints 6// INITIALISE A NEW FOO AND PASS THE PARSED JSON OBJECT TO ITvar fooJSON = new Foo(JSON.parse('{"a":4,"b":3}'));alert(fooJSON.test() ); //Prints 12
Do you want to add JSON serialization/deserialization functionality, right? Then look at this:
You want to achieve this:
toJson() is a normal method.
fromJson() is a static method.
Implementation:
var Book = function (title, author, isbn, price, stock){ this.title = title; this.author = author; this.isbn = isbn; this.price = price; this.stock = stock; this.toJson = function (){ return ("{" + "\"title\":\"" + this.title + "\"," + "\"author\":\"" + this.author + "\"," + "\"isbn\":\"" + this.isbn + "\"," + "\"price\":" + this.price + "," + "\"stock\":" + this.stock + "}"); };};Book.fromJson = function (json){ var obj = JSON.parse (json); return new Book (obj.title, obj.author, obj.isbn, obj.price, obj.stock);};
Usage:
var book = new Book ("t", "a", "i", 10, 10);var json = book.toJson ();alert (json); //prints: {"title":"t","author":"a","isbn":"i","price":10,"stock":10}var book = Book.fromJson (json);alert (book.title); //prints: t
Note: If you want you can change all property definitions like this.title
, this.author
, etc by var title
, var author
, etc. and add getters to them to accomplish the UML definition.