mixly
v1.0.0
Published
Collection of mixin tools for objects and functions
Downloads
160,123
Maintainers
Readme
mixly
Collection of mixin tools for objects and functions.
| compression | size | | :-------------- | ------: | | mixly.js | 8.94 kB | | mixly.min.js | 2.93 kB | | mixly.min.js.gz | 964 B |
Table of Contents
Install
$ npm install --save mixly
API
mixly
mixly(object[, object[, ...object]])
Alias: mixly/mixin
Creates prototype chain with the properties from the provided objects, by (shallow) copying own properties from each object onto respective elements in the chain.
var mixly = require('mixly');
var o1 = { O1: true, commonThing: 'o1' }
, o2 = { O2: true, commonThing: 'o2' }
, o3 = { O3: true, commonThing: 'o3' }
;
// (o1) -> (o2) -> (o3)
var o0 = mixly(o1, o2, o3);
assert.notStrictEqual(Object.getPrototypeOf(o0), o1, 'Object `o0` does not have prototype set to object `o1`');
assert.notStrictEqual(Object.getPrototypeOf(o1), o2, 'Object `o1` does not have prototype set to object `o2`');
assert.notStrictEqual(Object.getPrototypeOf(o2), o3, 'Object `o2` does not have prototype set to object `o3`');
assert.strictEqual(o0.O1, true, 'copied properties from the first object');
assert.strictEqual(o0.O2, true, 'has access to the properties of the second object');
assert.strictEqual(o0.O3, true, 'has access to the properties of the third object');
assert.strictEqual(o0.commonThing, 'o1', 'shared properties from first object "win"');
assert.strictEqual(Object.getPrototypeOf(o0).commonThing, 'o2', 'has access to the shared properties of the second object');
assert.strictEqual(Object.getPrototypeOf(Object.getPrototypeOf(o0)).commonThing, 'o3', 'has access to the shared properties of the third object');
assert.strictEqual(o0.hasOwnProperty('commonThing'), true, 'has shared properties from first object as own');
assert.strictEqual(o0.hasOwnProperty('O1'), true, 'has shared properties from first object as own');
assert.strictEqual(o0.hasOwnProperty('O2'), false, 'does not own properties from the second object');
assert.strictEqual(o0.hasOwnProperty('O3'), false, 'does not own properties from the third object');
More details in test/mixin.js test file.
append
mixly.append(object[, object[, ...object]])
Aliases: mixly/append
, mixly/flat
Appends objects' properties (shallow copy) into the first object.
var append = require('mixly/append');
var o1 = { O1: true, commonThing: 'o1' }
, o2 = { O2: true, commonThing: 'o2' }
, o3 = { O3: true, commonThing: 'o3' }
;
// o1 + o2 + o3
var oX = append(o1, o2, o3);
assert.strictEqual(oX, o1, 'first argument was modified');
assert.strictEqual(oX.O1, true, 'kept properties from the first object');
assert.strictEqual(oX.O2, true, 'obtained properties from the second object');
assert.strictEqual(oX.O3, true, 'obtained properties from the third object');
assert.strictEqual(oX.commonThing, 'o3', 'last object in the list overrides shared properties');
More details in test/append.js test file.
chain
mixly.chain(object[, object[, ...object]])
Aliases: mixly/chain
, mixly/proto
Modifies prototype chain for the provided objects, based on the order of the arguments.
var chain = require('mixly/chain');
var o1 = { O1: true, commonThing: 'o1' }
, o2 = { O2: true, commonThing: 'o2' }
, o3 = { O3: true, commonThing: 'o3' }
;
// o1 -> o2 -> o3
mixly.chain(o1, o2, o3);
assert.strictEqual(Object.getPrototypeOf(o1), o2, 'Object `o1` has prototype set to object `o2`');
assert.strictEqual(Object.getPrototypeOf(o2), o3, 'Object `o2` has prototype set to object `o3`');
assert.strictEqual(o1.O1, true, 'kept properties from the first object');
assert.strictEqual(o1.O2, true, 'has access to the properties of the second object');
assert.strictEqual(o1.O3, true, 'has access to the properties of the third object');
assert.strictEqual(o1.commonThing, 'o1', 'kept own shared properties');
assert.strictEqual(Object.getPrototypeOf(o1).commonThing, 'o2', 'has access to the shared properties of the second object');
assert.strictEqual(Object.getPrototypeOf(Object.getPrototypeOf(o1)).commonThing, 'o3', 'has access to the shared properties of the third object');
assert.strictEqual(o1.hasOwnProperty('commonThing'), true, 'kept own shared properties');
assert.strictEqual(o1.hasOwnProperty('O1'), true, 'kept own unique properties');
assert.strictEqual(o1.hasOwnProperty('O2'), false, 'does not own properties from the second object');
assert.strictEqual(o1.hasOwnProperty('O3'), false, 'does not own properties from the third object');
More details in test/chain.js test file.
copy
mixly.copy(object, object)
Alias: mixly/copy
Copies (shallow) own properties between provided objects. Used internally by other mixly
methods.
var copy = require('mixly/copy');
var o1 = { O1: true, commonThing: 'o1' }
, o2 = { O2: true, commonThing: 'o2' }
;
// o1 + o2
var oX = copy(o1, o2);
assert.strictEqual(oX, o1, 'first argument was modified');
assert.strictEqual(oX.O1, true, 'kept properties from the first object');
assert.strictEqual(oX.O2, true, 'obtained properties from the second object');
assert.strictEqual(oX.commonThing, 'o2', 'last object in the list overrides shared properties');
More details in test/copy.js test file.
extend
mixly.extend(function, function)
Alias: mixly/extend
Extends target class with superclass, assigns superclass prototype as prototype of the target class and adds superclass itself as __proto__
of the target class, allowing "static" methods inheritance.
var extend = require('mixly/extend');
function F1()
{
F1.super_.apply(this, arguments);
this.p0 += 'd2';
}
F1.prototype.p1 = 'f1';
F1.static1 = true;
function F2()
{
this.p0 = 'r2';
}
F2.prototype.p2 = 'f2';
F2.static2 = true;
// F1 -> F2
extend(F1, F2);
assert.strictEqual('p1' in F1.prototype, false, 'original prototype is gone');
assert.strictEqual('p2' in F1.prototype, true, 'replaced with new prototype');
assert.strictEqual(F1.static1, true, 'original static property is accessible');
assert.strictEqual(F1.static2, true, 'extended static property is accessible');
// new instance
var f1 = new F1();
assert.strictEqual(f1.p0, 'r2d2', 'constructor executes provided super constructor');
More details in test/extend.js test file.
funky
mixly.funky(function[, function[, ...function]])
Alias: mixly/funky
Creates prototype chain from the provided functions, by (shallow) copying prototypes from each function onto respective elements in the chain.
var funky = require('mixly/funky');
function F1()
{
this.super_.apply(this, arguments);
this.f1 = true;
}
F1.prototype.f1p = true;
function F2()
{
// this.super_ is reference to itself
// we're in the f0 context
// don't call super_.super_
this.f2 = true;
}
F2.prototype.f2p = true;
function F3()
{
// never gets here
this.f3 = true;
}
F3.prototype.f3p = true;
// F0 -> (F1) -> (F2) -> (F3)
var F0 = mixly.clone(F1, F2, F3);
var f0 = new F0();
assert.notStrictEqual(F0.prototype, F1.prototype, 'is not exactly F1');
assert.strictEqual(F0.prototype.f1p, true, 'but close');
F0.prototype.bla = 42;
assert.strictEqual('bla' in F1.prototype, false, 'F1 stays untouched');
assert.strictEqual(f0.f1, true, 'executed F1 constructor');
assert.strictEqual(f0.f2, true, 'executed F2 constructor');
assert.strictEqual('f3' in f0, false, 'skipped F3 constructor');
assert.strictEqual(f0.f1p, true, 'inherited F1 prototype properties');
assert.strictEqual(f0.f2p, true, 'inherited F2 prototype properties');
assert.strictEqual(f0.f3p, true, 'inherited F3 prototype properties');
More details in test/funky.js test file.
immutable
mixly.immutable(object[, object[, ...object]])
Alias: mixly/immutable
Creates immutable (shallow) copy of the provided objects. Similar to append
, but doesn't modify any of the provided objects.
var immutable = require('mixly/immutable');
var o1 = { O1: true, commonThing: 'o1' }
, o2 = { O2: true, commonThing: 'o2' }
, o3 = { O3: true, commonThing: 'o3' }
;
// oX + o1 + o2 + o3
var oX = immutable(o1, o2, o3);
assert.notStrictEqual(oX, o1, 'first argument was not modified');
assert.strictEqual(oX.O1, true, 'kept properties from the first object');
assert.strictEqual(oX.O2, true, 'obtained properties from the second object');
assert.strictEqual(oX.O3, true, 'obtained properties from the third object');
assert.strictEqual(oX.commonThing, 'o3', 'last object in the list overrides shared properties');
More details in test/immutable.js test file.
inherit
mixly.inherit(function, function)
Alias: mixly/inherit
Assigns prototype from the superclass to the target class, compatible with node's builtin version (util.inherit
), but browser-friendly (without browserify magic, i.e. works with other packagers).
var inherit = require('mixly/inherit');
function Child() { Parent.call(this); }
function Parent() {}
// Child -> Parent
inherit(Child, Parent);
// create instance
var child = new Child();
assert.strictEqual(child.constructor.super_, Parent, 'child has reference to the Parent constructor');
assert.strictEqual(Object.getPrototypeOf(Object.getPrototypeOf(child)), Parent.prototype, 'child has Parent in the prototype chain');
assert.strictEqual(child instanceof Child, true, 'child instance of Child');
assert.strictEqual(child instanceof Parent, true, 'child instance of Parent');
More details in test/inherit.js test file.
License
Mixly is released under the MIT license.