Simple classes
==============

JavaScript has objects, which through the object tree support
inheritance.  Almost all object-oriented languages have classes and
instances, but JavaScript has neither.  This will be explained later,
along with a discussion of the consequences.

For now our focus is on getting going with object-oriented
programming.  The easiest way to do this is via ``create``.


Definition
----------

Here's a factory function that creates classes.  It returns a function
called ``cls``, which in turn when called returns instances.  At it's
heart is ``create``, and also ``apply`` and ``arguments``, which we've not
seen before).

.. literalinclude:: /core-javascript-work/library.js
   :language: javascript
   :start-after: start SimpleClass
   :end-before: end SimpleClass


Why *cls*?
----------

We call the returned function *cls* because in JavaScript *class*,
like *function* is a reserved word in JavaScript.  However, in
JavaScript the identifier *class* has no meaning, and cannot be used
in any valid JavaScript program.  It seems that they intended to
provide a built-in class capability, but never got round to it.


Fruit example
-------------

Here's an example of the use of ``SimpleClass``.  There's a bug in it,
and I've changed the test so it passes.  Can you find the bug and fix
the example?

.. literalinclude:: /core-javascript-work/test_library.js
   :language: javascript
   :start-after: start SimpleClass
   :end-before: end SimpleClass
