-
Notifications
You must be signed in to change notification settings - Fork 3
Constructing objects with generators
In JavaScript any function can be used to construct an object by calling it with the new operator.
That is a great key feature that helps to make JavaScript a simple but powerful language.
If you turn the function into a generator you gain extra flexibility, since you can have rules for when
a new object is created and when an existing one is reused.
Sometimes it is convenient to have a default behavior for generating instances, making the specification of a generator
an optional parameter. If you call Generator() you get a new Object back. So it is equivalent to Generator(Object) or
{}.
If you are used to progamming with classes the common generator pattern will seem familiar. First define a constructor,
function Rectangle(width,height) {
this.width = width;
this.height = height;
}
Rectangle.prototype.resize = function(width,height) {
this.width = width;
this.height = height;
};
By calling Generator(Rectangle) you get a function that will create an object which is an instanceof Rectangle and then call the constructor. Finally the created object will be returned. So in the vanilla version a generator will work just like if you called the constructor with a new operator.
If you want to make objects that are both a Rectangle and a Shape call Generator(Rectangle,Shape). The generator will
chain the protoypes of the two functions together so the created instances will be an instanceof both.
The generator will have a couple of properties describing what will be constructed.
| name | description |
|---|---|
| args | A list of objects defining the arguments to the constructor |
| types | A map of the typed properties of the object generated. |
| bases | A list of base constructors defined on the main constructor or passed to Generator. |
| variants | A map of generator variants by variant name. |
| variant | Method used to set and get a named variant. Unknown variants fall back to the default or base. |
| mixin | Method used to mix variables and functions into the prototype of the generated object. |
| restrict | Method for adding Restricting Object Generation. |
| info | Internal housekeeping |
| info.symbol | When set on a package by a resolver. Refers to the name of the generator. |
| info.within | When set on a package by a resolver. Refers to the package object it is on. |
| info.package | When set on a package by a resolver. Refers to the package name it is on. |
| info.constructors | The exploded list of constructors in the order they will be called. Entry -1 will be the main constructor. |
| info.singleton | The singleton instance when created |
| info.options | Options passed when making the generator. |