Change object instantiation to create wrappers and not wrapped classes.
Review Request #12906 — Created March 22, 2023 and submitted
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:
Consumers couldn't do
instanceofchecks against the class, because
the wrapped class's instance would never be an instance of the
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
It just generally made it confusing, having
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