Sharing behavior through objects
In a prototype model, an object can obtain behavior through links to other objects. When a property or method is absent locally, lookup continues through a prototype or parent relationship. New objects can therefore extend existing ones without first requiring a complete hierarchy of separate class definitions.
Local and inherited properties
Inherited lookup is not the same as copying all prototype properties into every object. A local property can take precedence and shadow an inherited one. JavaScript specifies a prototype chain, while Self uses parent slots and message-lookup rules. These are related approaches, but their exact object structures and semantics differ.
Understanding shared mutation
When objects read from a shared prototype, changing that prototype can affect subsequent lookups. Objects with a shadowing local property may continue to read their own value. Updating an object and updating its shared source are consequently different operations; cloning also does not automatically imply deep copying of nested data.
Class syntax over a prototype model
A language can provide class syntax while retaining prototype relationships underneath. JavaScript combines these features, whereas Self explains delegation through objects and slots. Comparing Io, Self, and JavaScript therefore requires examining lookup and state behavior rather than simply checking whether their syntax contains a class keyword.