Ruby Structs are an awesome way to add several attributes to a class. Inspired by these, Strukt provides a similiar minimalistic API for node and the browser. It allows you to quickly create constructor functions with less code.
$ npm install strukt
var Strukt = require('strukt');
Grab lib/strukt.js and include it in your HTML document. If an AMD or CommonJS loader is present it will be used, otherwise Strukt
is assigned to window.Strukt
.
In case you are using component (you should, it's awesome!):
$ component install florian/Strukt
var Strukt = require('strukt');
Simple. Pass the parameters you want to Struct
, a new constructor function will be returned.
var Point = new Struct('x', 'y');
var p = new Point(42, 1337);
p.x; // 42
p.y; // 1337
Prefer CoffeeScript?
class Point extends new Struct 'x', 'y'
# More class logic
p = new Point 42, 1337
p.x # 42
p.y # 1337
Explicit is better than implicit. The Zen of Python
Explicits structs are pretty much the same thing, but you pass an object to the returned constructor.
var Person = new Struct.Explicit('forename', 'surname');
var john = new Person({
forename: 'John',
surname: 'Doe'
});
john.forename; // 'John'
john.surname; // 'Doe'
Maybe you'd like to add a constructor function to your Struct. If the last argument of Struct
or Struct.Explicit
is a function it'll be used as a constructor function.
var Person = new Struct.Explicit('forename', 'surname', function () {
alert('Welcome ' + this.forename + " " + this.surname);
});
new Person({
forename: 'John',
surname: 'Doe'
}); // Will alert 'Welcome John Doe'
Struct
and Struct.Explicit
return functions, so you can just add properties to the prototype as always.
var Point = new Struct("x", "y");
Point.prototype.equals = function (pt) {
return this.x == pt.x && this.y == pt.y;
}
Visit spec/index.html in your browser to run the test suite.
Alternatively you can install testacular and enjoy the awesomeness
$ testacular start
It will launch several browsers and run the tests again if a a spec or the library code changes.