• 
      

    Change object instantiation to create wrappers and not wrapped classes.

    Review Request #12906 — Created March 22, 2023 and submitted

    Information

    Spina
    master

    Reviewers

    In Spina 1, when instantiating a Spina-wrapped class, the wrapper would
    return an instance of the wrapped class, rather than the wrapper. The
    aim was to get as close as possible to returning the defined class.
    However, this had issues:

    1. Consumers couldn't do instanceof checks against the class, because
      the wrapped class's instance would never be an instance of the
      wrapper.

    2. Operations on the wrapper's prototype wouldn't apply to the wrapped
      class's prototype, and this would break things like Jasmine spies or
      any operations that needed to deal with instances or state on
      prototypes.

    3. It just generally made it confusing, having MyClass and
      new MyClass() being very different things.

    Ultimately, there's no reason to avoid returning an instance of the
    wrapper class. This change updates the logic so we're always getting an
    instance of the class the caller constructed.

    This shouldn't negatively impact any callers, but it is a big enough
    change in behavior that we're calling this Spina 2.0. (More
    potentially-breaking changes are also coming).

    Tested this in Review Board, along with some upcoming changes, and
    verified all tests passed.

    Manually tested construction of wrapper classes, making sure that
    the instances were in fact instances of the wrapper class and not the
    wrapped class.

    Summary ID
    Change object instantiation to create wrappers and not wrapped classes.
    In Spina 1, when instantiating a Spina-wrapped class, the wrapper would return an instance of the wrapped class, rather than the wrapper. The aim was to get as close as possible to returning the defined class. However, this had issues: 1. Consumers couldn't do `instanceof` checks against the class, because the wrapped class's instance would never be an instance of the wrapper. 2. Operations on the wrapper's prototype wouldn't apply to the wrapped class's prototype, and this would break things like Jasmine spies or any operations that needed to deal with instances or state on prototypes. 3. It just generally made it confusing, having `MyClass` and `new MyClass()` being very different things. Ultimately, there's no reason to avoid returning an instance of the wrapper class. This change updates the logic so we're always getting an instance of the class the caller constructed. This shouldn't negatively impact any callers, but it is a big enough change in behavior that we're calling this Spina 2.0. (More potentially-breaking changes are also coming).
    db27b3f1a349ad7f030f6e7c47df8189e10e6529
    david
    1. Ship It!
    2. 
        
    chipx86
    Review request changed
    Status:
    Completed
    Change Summary:
    Pushed to master (72a6c5f)