mixi is a library that enables the easy composition of constructors from other constructors/objects, like so:
{ }Fooprototypea = 'venusaur'; { }Barprototypeb = 'blastoise'; var baz = c: 'charizard'; var Constructor = ; var instance = ; console; // prints:// "venusaur", "blastoise", "charizard"
mixi creates a new constructor, merging the prototypes of the constructors you pass in to create the new constructor's consolidated prototype. If you pass in objects, those objects are merged into the result, as well.
However, interesting things happen if you pass in objects that share the same key:
Functions
If two or more supplied arguments share a function property, mixi will create a new wrapper function that calls each shared property sequentially, in the opposite order from how they were passed in.
var foo = { console; }; var bar = { console; }; var instance = new ; instance; // prints:// "first"// "last"
Objects
If two or more supplied arguments share an object property, mixi will merge these objects into a new object and assign it as the value of the shared key.
var foo = object: x: 1 y: 2 ; var bar = object: x: 3 z: 4 ; var instance = new ; console; // prints:// "{ x: 3, y: 2, z: 4 }"
Arrays
If two or more supplied arguments share an array property, mixi will flatten these arrays and store the flattened array as the value of the shared key.
var foo = array: 1 2 ; var bar = array: 3 4 ; var instance = new ; console; // prints:// "[ 1, 2, 3, 4]"
mixi has a couple more tricks for dealing with invocation order of merged functions:
.break()
When a merged function is being executed, a .break
function property exists on the execution context. Calling .break()
will stop any remaining sibling functions for the current key from being executed:
var foo = { // this will never be called console; }; var bar = { console; this; }; var instance = new ; instance; // prints:// "first"
.continue()
When a merged function is being executed, a .continue
function property exists on the execution context. Calling .continue()
will immediately advance to the next wrapped sibling function for the current key:
var foo = { console; }; var bar = { this; console; }; var instance = new ; instance; // prints:// "last"// "first"