Class Prototypes

In Javascript, objects and arrays have access via a member to their parent class’s prototype. This allows the user to modify a base property of the class and have it affect all instances. We can do something very similar and very easily in Copper.
Cutting straight to the code, suppose we have an object named Beast, which we copy (via assignment) to make multiple instances:

Beast = [ legs=4 ] { }
rover = Beast
spike = Beast

Both “rover” and “spike” here inherit the member “legs”, which is set to four. Now suppose “rover” loses a leg. We substract one.

–(rover.legs)
# Or rover.legs = 3 #

Then later on “rover” completely heals. How many legs should rover have? We could do…

rover.legs = Beast.legs

But we’re lazy, a real world scenario might be more complicated, and we want to use prototyping. With that in mind, we could set up Beast as follows:

Beast = [
legs = 4,
heals = { super.legs = super.prototype.legs }
] {
this.prototype ~ this,
ret(copy_of(this))
}

This does mean that we need to change our construction of “rover” and “spike” from being direct copies of Beast to being the recipients of function calls to Beast. This pattern may be comfortable to those who prefer constructors, and it allows for initialization parameters.

rover = Beast()
spike = Beast()

Alternatively, we could assign the prototype member of Beast after its construction.

Beast = [
legs = 4
prototype = {}
heals = { super.legs = super.prototype.legs }
]
Beast.prototype ~ Beast

In either case, now we can call the “heals” function on “rover” and let the prototype do the work.

rover.heals()

What about cyclic references?
Copper has no such issue since everything is tied to the global stack. If we were to replace the implementation of Beast with an empty function, all the pointer references would, upon being used, declare the presence of an empty function and terminate. No crash; just a warning message.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s