/ Published in: JavaScript
Prototipal heritance and leaving trail of implementations
Expand |
Embed | Plain Text
N = {}; var myExtend = function (destination/**, supers */) { var supers = Array.prototype.slice.call(arguments, 1); var implementations = destination.implementations || []; var registerInheritance = function (target, source) { if (source.constructor !== Object && !_.include(implementations, source)) { implementations.push(source); } }; _.each(supers, function (localSuper) { registerInheritance(destination, localSuper); _.extend(destination, localSuper); }); if (implementations.length > 0) { destination.implementations = implementations; } return destination; }; var implements = function (obj, prototype) { var doImplements = false; var implementationStack = []; var getImplementations = function (source) { _.each(source.implementations, function (localImplementation) { var notIncluded = !_.any(implementationStack, function (i) { return _.isEqual(localImplementation, i); }); if (notIncluded) { implementationStack.push(localImplementation); } if (localImplementation.implementations && localImplementation.implementations.length > 0) { getImplementations(localImplementation); } }); }; getImplementations(obj); doImplements = _.any(implementationStack, function (implementation) { return implementation.constructor === prototype; }); console.log(implementationStack); return doImplements; }; N.sup = function () { return myExtend(this, { sup: 'this' }); }; N.Base = function () { var sup = new N.sup(); return myExtend(this, sup, { base: 'base' }); }; N.Gadget = function () { var base = new N.Base(); return myExtend(this, base, { bla: 'bla' }); }; N.middleG = function () { var base = new N.Base(); return myExtend(this, base, { lala: 'lala' }); }; N.GadgetInterface = function () { return myExtend(this, { i: 'interface' }); }; N.myGadget = function () { var i = new N.GadgetInterface(); var g = new N.Gadget(); var gm = new N.middleG(); return myExtend(this, i, g, gm, { foo:'foo' }); }; var s = new N.myGadget(); console.log(s); console.log(implements(s, N.sup)); console.log(implements(s, N.Base)); console.log(implements(s, N.Gadget)); console.log(implements(s, N.GadgetInterface));
You need to login to post a comment.
