Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript turning JSON string into instance of function

I have a bunch of JSON string returned from an ajax call in a specific format and when starting to convert them all into my own Javascript object, I start to wonder if there is any easier way since we're talking Javascript here.

I'll have var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; And I'd like to easily associate each of these objects with my functions so that I can do things like:

myClass.prototype.doSomething = function() {
  // do something to this.name
};

$.each(manyOfThem, function(index, item) {
  item.doSomething();
});

I guess my concern is, I would not want to (because its repetitive) do this:

var myClass = function(item) {
  this.name = item.name;
  // do the same for the rest of item's potentially 20 properties
};

var oneOfThem = new myClass(manyOfThem[0]); // I think this is redundant....
oneOfThem.doSomething();

Anyhow, if there is also (security?) reasons why I'd just have to suck it up and do them all manually please share as well, thanks!

like image 359
Lim Avatar asked Apr 04 '13 02:04

Lim


People also ask

Which method converts a JSON string to a JavaScript object?

The JSON.parse() method parses a JSON string, constructing the JavaScript value or object described by the string.

Can a JSON value be a function?

The JSONVALUE function parses data in JavaScript Object Notation (JSON) format that is accessed at the specified path, and it extracts a scalar value that has the specified ID.

How can I convert JSON to string?

Use the JavaScript function JSON.stringify() to convert it into a string. const myJSON = JSON.stringify(obj); The result will be a string following the JSON notation.

Can JSON Stringify a function?

The JSON.stringify() method converts a JavaScript value to a JSON string, optionally replacing values if a replacer function is specified or optionally including only the specified properties if a replacer array is specified.


2 Answers

You mean, something like (see jsfiddle) :

var MyClass = function() {};
MyClass.prototype = {
    doSomething: function() {
        alert(this.name);
    }
};

Then

var manyObj = $.map(manyOfThem, function(obj) {
   return $.extend( new MyClass(), obj );
});

So you can call :

manyObj[0].doSomething();  // alert("a")

However, this approach will not preserve a direct copy with the manyOfThem object. (In the example above, changing manyOfThem[0].name = "foo"; will not affect manyObj[0] and a call to manyObj[0].doSomething(); will still alert "a". To preserve a direct reference to your object, do this :

var manyObj = $.map(manyOfThem, function(obj) {
    function F() {};
    F.constructor = MyClass;
    F.prototype = obj;
    $.extend(F.prototype, new MyClass());
    return new F();
});


manyObj[0].doSomething();  // alert("a")

manyOfThem[0].name = "foo";  // modify the referenced object

manyObj[0].doSomething();  // alert("foo") ..also modifies the behaviour of the instance
like image 177
Yanick Rochon Avatar answered Sep 23 '22 21:09

Yanick Rochon


One solution without using a class is

var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ];

function doSomething(){
    console.log(this.name)
}

$.each(manyOfThem, function(index, item) {
  doSomething.call(item);
});

Demo: Fiddle

If you want to create an instance of type MyClas then

var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ];

function MyClass(item){
    $.extend(this, item);
}

MyClass.prototype.doSomething = function(){
    console.log(this.name)
}

$.each(manyOfThem, function(index, item) {
    var obj = new MyClass(item);
    obj.doSomething()
});

Demo: Fiddle

like image 41
Arun P Johny Avatar answered Sep 25 '22 21:09

Arun P Johny