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)