Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-770

objects serialised to system.js collection lose prototype and all methods defined outside the constructor

    • Type: Icon: Bug Bug
    • Resolution: Done
    • Priority: Icon: Major - P3 Major - P3
    • None
    • Affects Version/s: 1.3.3
    • Component/s: JavaScript
    • None
    • Environment:
      Mac OS 10.6 64 bit. Seems to be JS-based, so probably all.
    • None
    • None
    • None
    • None
    • None
    • None
    • None

      when an object is serialized to system.js and then later instantiated, it loses its prototype and all methods defined outside its constructor.

      To see this, consider the following script

      //currently this prints outputs and doesn't do any nice asserts
      //this si for clarity of bug reporting

      var s = db.system.js;

      PrototypicalInheritanceObject = function ()

      { this.constructor_assigned_property = 'this constructor_assigned_property exists'; }

      PrototypicalInheritanceObject.own_property = 'this own_property exists';

      PrototypicalInheritanceObject.own_method = function ()

      { return "this own_method exists"; }

      PrototypicalInheritanceObject.prototype.prototypical_property = 'this prototypical_property exists';

      PrototypicalInheritanceObject.prototype.prototypical_method = function ()

      { return "this prototypical_method exists"; }

      print("======================================");
      print("Client side");
      print("======================================");

      //test that this behaves as normal in the shell interpreter
      var p = new PrototypicalInheritanceObject();
      print("constructor property - shell interpreter:");
      print(p.constructor_assigned_property);
      print("");
      print("own property - shell interpreter:");
      print(p.own_property);
      print("");
      print("own method - shell interpreter:");
      print(tojson(p.own_method));
      print("");
      print("prototypical property - shell interpreter:");
      print(p.prototypical_property);
      print("");
      print("prototypical method - shell interpreter:");
      print(tojson(p.prototypical_method));

      print("======================================");
      print("server side");
      print("======================================");
      s.insert( { _id : "PrototypicalInheritanceObject", value : PrototypicalInheritanceObject});
      print("constructor property - server interpreter:");
      print(db.eval("var p = new PrototypicalInheritanceObject(); return p.constructor_assigned_property"));
      print("");
      print("own property - server interpreter:");
      print(db.eval("var p = new PrototypicalInheritanceObject(); return p.own_property"));
      print("");
      print("own method - server interpreter:");
      print(db.eval("var p = new PrototypicalInheritanceObject(); return tojson(p.own_method)"));
      print("");
      print("prototypical property - server interpreter:");
      print(db.eval("var p = new PrototypicalInheritanceObject(); return p.prototypical_property"));
      print("");
      print("prototypical method - server interpreter:");
      print(db.eval("var p = new PrototypicalInheritanceObject(); return tojson(p.prototypical_property)"));

      The output for the client side and server side phases seem like they should be the same, but they are not.

      ======================================
      Client side
      ======================================
      constructor property - shell interpreter:
      this constructor_assigned_property exists

      own property - shell interpreter:
      undefined

      own method - shell interpreter:
      undefined

      prototypical property - shell interpreter:
      this prototypical_property exists

      prototypical method - shell interpreter:
      function () { return "this prototypical_method exists"; }

      ======================================
      server side
      ======================================
      constructor property - server interpreter:
      this constructor_assigned_property exists

      own property - server interpreter:
      null

      own method - server interpreter:
      undefined

      prototypical property - server interpreter:
      null

      prototypical method - server interpreter:
      undefined

            Assignee:
            eliot Eliot Horowitz (Inactive)
            Reporter:
            howthebodyworks dan
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              None
              None
              None
              None