Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6801797
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 26, 20262026-05-26T19:08:40+00:00 2026-05-26T19:08:40+00:00

I have an app that allows users to generate objects, and store them (in

  • 0

I have an app that allows users to generate objects, and store them (in a MySQL table, as strings) for later use. The object could be :

function Obj() {
    this.label = "new object";
}

Obj.prototype.setLabel = function(newLabel) {
    this.label = newLabel;
}

If I use JSON.stringify on this object, I will only get the information on Obj.label (the stringified object would be a string like {label: "new object"}. If I store this string, and want to allow my user to retrieve the object later, the setLabel method will be lost.

So my question is: how can I re-instantiate the object, so that it keeps the properties stored thanks to JSON.stringify, but also gets back the different methods that should belong to its prototype. How would you do that ? I was thinking of something along “create a blank object” and “merge it with the stored one’s properties”, but I can’t get it to work.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-26T19:08:40+00:00Added an answer on May 26, 2026 at 7:08 pm

    To do this, you’ll want to use a “reviver” function when parsing the JSON string (and a “replacer” function or a toJSON function on your constructor’s prototype when creating it). See Section 15.12.2 and 15.12.3 of the specification. If your environment doesn’t yet support native JSON parsing, you can use one of Crockford’s parsers (Crockford being the inventor of JSON), which also support “reviver” functions.

    Here’s a simple bespoke example that works with ES5-compliant browsers (or libraries that emulate ES5 behavior) (live copy, run in Chrome or Firefox or similar), but look after the example for a more generalized solution.

    // Our constructor function
    function Foo(val) {
      this.value = val;
    }
    Foo.prototype.nifty = "I'm the nifty inherited property.";
    Foo.prototype.toJSON = function() {
      return "/Foo(" + this.value + ")/";
    };
    
    // An object with a property, `foo`, referencing an instance
    // created by that constructor function, and another `bar`
    // which is just a string
    var obj = {
      foo: new Foo(42),
      bar: "I'm bar"
    };
    
    // Use it
    display("obj.foo.value = " + obj.foo.value);
    display("obj.foo.nifty = " + obj.foo.nifty);
    display("obj.bar = " + obj.bar);
    
    // Stringify it with a replacer:
    var str = JSON.stringify(obj);
    
    // Show that
    display("The string: " + str);
    
    // Re-create it with use of a "reviver" function
    var obj2 = JSON.parse(str, function(key, value) {
      if (typeof value === "string" &&
          value.substring(0, 5) === "/Foo(" &&
          value.substr(-2) == ")/"
         ) {
        return new Foo(value.substring(5, value.length - 2));
      }
      return value;
    });
    
    // Use the result
    display("obj2.foo.value = " + obj2.foo.value);
    display("obj2.foo.nifty = " + obj2.foo.nifty);
    display("obj2.bar = " + obj2.bar);
    

    Note the toJSON on Foo.prototype, and the function we pass into JSON.parse.

    The problem there, though, is that the reviver is tightly coupled to the Foo constructor. Instead, you can adopt a generic framework in your code, where any constructor function can support a fromJSON (or similar) function, and you can use just one generalized reviver.

    Here’s an example of a generalized reviver that looks for a ctor property and a data property, and calls ctor.fromJSON if found, passing in the full value it received (live example):

    // A generic "smart reviver" function.
    // Looks for object values with a `ctor` property and
    // a `data` property. If it finds them, and finds a matching
    // constructor that has a `fromJSON` property on it, it hands
    // off to that `fromJSON` fuunction, passing in the value.
    function Reviver(key, value) {
      var ctor;
    
      if (typeof value === "object" &&
          typeof value.ctor === "string" &&
          typeof value.data !== "undefined") {
        ctor = Reviver.constructors[value.ctor] || window[value.ctor];
        if (typeof ctor === "function" &&
            typeof ctor.fromJSON === "function") {
          return ctor.fromJSON(value);
        }
      }
      return value;
    }
    Reviver.constructors = {}; // A list of constructors the smart reviver should know about  
    

    To avoid having to repeat common logic in toJSON and fromJSON functions, you could have generic versions:

    // A generic "toJSON" function that creates the data expected
    // by Reviver.
    // `ctorName`  The name of the constructor to use to revive it
    // `obj`       The object being serialized
    // `keys`      (Optional) Array of the properties to serialize,
    //             if not given then all of the objects "own" properties
    //             that don't have function values will be serialized.
    //             (Note: If you list a property in `keys`, it will be serialized
    //             regardless of whether it's an "own" property.)
    // Returns:    The structure (which will then be turned into a string
    //             as part of the JSON.stringify algorithm)
    function Generic_toJSON(ctorName, obj, keys) {
      var data, index, key;
    
      if (!keys) {
        keys = Object.keys(obj); // Only "own" properties are included
      }
    
      data = {};
      for (index = 0; index < keys.length; ++index) {
        key = keys[index];
        data[key] = obj[key];
      }
      return {ctor: ctorName, data: data};
    }
    
    // A generic "fromJSON" function for use with Reviver: Just calls the
    // constructor function with no arguments, then applies all of the
    // key/value pairs from the raw data to the instance. Only useful for
    // constructors that can be reasonably called without arguments!
    // `ctor`      The constructor to call
    // `data`      The data to apply
    // Returns:    The object
    function Generic_fromJSON(ctor, data) {
      var obj, name;
    
      obj = new ctor();
      for (name in data) {
        obj[name] = data[name];
      }
      return obj;
    }
    

    The advantage here being that you defer to the implementation of a specific “type” (for lack of a better term) for how it serializes and deserializes. So you might have a “type” that just uses the generics:

    // `Foo` is a constructor function that integrates with Reviver
    // but doesn't need anything but the generic handling.
    function Foo() {
    }
    Foo.prototype.nifty = "I'm the nifty inherited property.";
    Foo.prototype.spiffy = "I'm the spiffy inherited property.";
    Foo.prototype.toJSON = function() {
      return Generic_toJSON("Foo", this);
    };
    Foo.fromJSON = function(value) {
      return Generic_fromJSON(Foo, value.data);
    };
    Reviver.constructors.Foo = Foo;
    

    …or one that, for whatever reason, has to do something more custom:

    // `Bar` is a constructor function that integrates with Reviver
    // but has its own custom JSON handling for whatever reason.
    function Bar(value, count) {
      this.value = value;
      this.count = count;
    }
    Bar.prototype.nifty = "I'm the nifty inherited property.";
    Bar.prototype.spiffy = "I'm the spiffy inherited property.";
    Bar.prototype.toJSON = function() {
      // Bar's custom handling *only* serializes the `value` property
      // and the `spiffy` or `nifty` props if necessary.
      var rv = {
        ctor: "Bar",
        data: {
          value: this.value,
          count: this.count
        }
      };
      if (this.hasOwnProperty("nifty")) {
        rv.data.nifty = this.nifty;
      }
      if (this.hasOwnProperty("spiffy")) {
        rv.data.spiffy = this.spiffy;
      }
      return rv;
    };
    Bar.fromJSON = function(value) {
      // Again custom handling, for whatever reason Bar doesn't
      // want to serialize/deserialize properties it doesn't know
      // about.
      var d = value.data;
          b = new Bar(d.value, d.count);
      if (d.spiffy) {
        b.spiffy = d.spiffy;
      }
      if (d.nifty) {
        b.nifty = d.nifty;
      }
      return b;
    };
    Reviver.constructors.Bar = Bar;
    

    And here’s how we might test that Foo and Bar work as expected (live copy):

    // An object with `foo` and `bar` properties:
    var before = {
      foo: new Foo(),
      bar: new Bar("testing", 42)
    };
    before.foo.custom = "I'm a custom property";
    before.foo.nifty = "Updated nifty";
    before.bar.custom = "I'm a custom property"; // Won't get serialized!
    before.bar.spiffy = "Updated spiffy";
    
    // Use it
    display("before.foo.nifty = " + before.foo.nifty);
    display("before.foo.spiffy = " + before.foo.spiffy);
    display("before.foo.custom = " + before.foo.custom + " (" + typeof before.foo.custom + ")");
    display("before.bar.value = " + before.bar.value + " (" + typeof before.bar.value + ")");
    display("before.bar.count = " + before.bar.count + " (" + typeof before.bar.count + ")");
    display("before.bar.nifty = " + before.bar.nifty);
    display("before.bar.spiffy = " + before.bar.spiffy);
    display("before.bar.custom = " + before.bar.custom + " (" + typeof before.bar.custom + ")");
    
    // Stringify it with a replacer:
    var str = JSON.stringify(before);
    
    // Show that
    display("The string: " + str);
    
    // Re-create it with use of a "reviver" function
    var after = JSON.parse(str, Reviver);
    
    // Use the result
    display("after.foo.nifty = " + after.foo.nifty);
    display("after.foo.spiffy = " + after.foo.spiffy);
    display("after.foo.custom = " + after.foo.custom + " (" + typeof after.foo.custom + ")");
    display("after.bar.value = " + after.bar.value + " (" + typeof after.bar.value + ")");
    display("after.bar.count = " + after.bar.count + " (" + typeof after.bar.count + ")");
    display("after.bar.nifty = " + after.bar.nifty);
    display("after.bar.spiffy = " + after.bar.spiffy);
    display("after.bar.custom = " + after.bar.custom + " (" + typeof after.bar.custom + ")");
    
    display("(Note that after.bar.custom is undefined because <code>Bar</code> specifically leaves it out.)");
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a web app (java, tomcat) that allows users to generate reports through
I have an existing web app that allows users to rate items based on
We have a WPF app that allows our users to download encrypted content and
I have a Silveright app that allows users to specify filters on a few
We have a desktop app that allows users to fill in a questionnaire. For
I have an app that allows the user to choose an image, at design
I have an app that allows you to create Home shortcuts to a specific
I have a Flex App that allows you to dynamically build an animation. It
I have a SQL interface page in my classic ASP web app that allows
I am creating a web app that requires the use of a Java Object

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.