Properties are objects (OO sense, not necessarily Scala object declaration sense) that govern access to a (possibly calculated) field. This means properties can have other methods in addition to get/set logic, such as registering event listeners.
Access (including mutation) is syntactically identical to fields (vals/vars)
All logic and/or state of a property is structurally grouped within the property object
Property objects directly are accessible via reflection APIs (on equal footing to methods, fields, etc)
vals and vars are the simplest instances of Properties (the property object was “compiled away” as an optimization and should still be accessible on demand)
Properties have both a “bound” and “unbound” aspect. An unbound property can be used to access its bound counterpart by passing it an instance of the owning object with which to bind.
Properties can be abstract and either specified in a derived class, or receive their implementation via the constructor