Add options for installing and merging class attributes.

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

Information

Spina
master

Reviewers

This introduces some important new options for Spina, designed to fix
problems encountered as we ported more class hierarchies from Backbone
to Spina.

ES6 classes have static attributes (which must be accessed on the class
constructor name) and instance attributes (which are only created when a
class is instantiated). What's missing are attributes that live on the
protocol (more akin to Python class attributes), which are what Backbone
really expects.

The recommendation is now to use static attributes. Spina now provides a
prototypeAttrs option for classes that are used to specify static
attributes (like events, defaults,tagName`, etc.) that must be made
available on the prototype. On class preparation, getters/setters will
be injected on the prototype to wrap the static attributes.

To aid in keeping attributes manageable, there's also a new
automergedAttrs option that can be defined on a class. This is used by
the class and any subclasses to merge together attributes containing
keys. For example, if a parent class and subclass both define events,
and this is in some base class's automergedAttrs, then the two will be
combined, reducing the chances of missing entries.

skipAutomergedAttrs can be used by a subclass to turn this behavior
off for select attributes, or all attributes.

These will be enabled soon for the built-in classes, and consumers can
use these to help transition to static-only attributes and to refine
class architectures.

Tested these new options in Review Board when converting classes to
Spina. Verified that specified attributes would merge and were
accessible on the prototype.

Summary ID
Add options for installing and merging class attributes.
This introduces some important new options for Spina, designed to fix problems encountered as we ported more class hierarchies from Backbone to Spina. ES6 classes have static attributes (which must be accessed on the class constructor name) and instance attributes (which are only created when a class is instantiated). What's missing are attributes that live on the protocol (more akin to Python class attributes), which are what Backbone really expects. The recommendation is now to use static attributes. Spina now provides a `prototypeAttrs` option for classes that are used to specify static attributes (like `events`, `defaults, `tagName`, etc.) that must be made available on the prototype. On class preparation, getters/setters will be injected on the prototype to wrap the static attributes. To aid in keeping attributes manageable, there's also a new `automergedAttrs` option that can be defined on a class. This is used by the class and any subclasses to merge together attributes containing keys. For example, if a parent class and subclass both define `events`, and this is in some base class's `automergedAttrs`, then the two will be combined, reducing the chances of missing entries. `skipAutomergedAttrs` can be used by a subclass to turn this behavior off for select attributes, or all attributes. These will be enabled soon for the built-in classes, and consumers can use these to help transition to static-only attributes and to refine class architectures.
fd14ec673e8e58112132e1723aa64859c3af6796
Description From Last Updated

Typo: merged -> merge.

daviddavid
david
  1. 
      
  2. src/objects.ts (Diff revision 1)
     
     
    Show all issues

    Typo: merged -> merge.

  3. 
      
chipx86
Review request changed
Status:
Completed
Change Summary:
Pushed to master (1a5816b)