Yet another simple Class pattern

by julienrf

JavaScript

function Any() {}
Any.extend = function (spec) {
    var result = function() { result.constructor.apply(this, arguments); }
    result.prototype = Object.create(this.prototype);
    result.extend = this.extend;
    result.super = this.prototype;
    if (spec.constructor !== Object) {
        result.constructor = spec.constructor;
        delete spec.constructor;
    }
    for (var p in spec) {
        result.prototype[p] = spec[p];
    }
    return result;
};

var Sub = Any.extend({
    foo: function () {
        return this.bar();
    },
    bar: function () {
        return 40;
    }
});

var SubSub = Sub.extend({
    constructor: function (spec) {
        this.val = spec.val;
    },
    bar: function () {
        return this.val + SubSub.super.bar.call(this);
    }
});

var SubSubSub = SubSub.extend({
    flop: function () { return 'foo'; }
});

var o3 = new Sub();
var o4 = new SubSub({ val: 2 });
var o5 = new SubSubSub({ val: 2 });
console.log(o3);
console.log(o4);
console.log(o5);
console.log(o3.foo());
console.log(o4.foo());
console.log(o5.foo());
console.log(o3 instanceof SubSub);
console.log(o4 instanceof SubSub);
console.log(o5 instanceof SubSub);