JavaScript Classical Simulation - dcrockford

by Joshua McNeese

JavaScript

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Function.method('inherits', function (parent) {
    this.prototype = new parent();
    var d = {}, 
        p = this.prototype;
    this.prototype.constructor = parent; 
    this.method('uber', function uber(name) {
        if (!(name in d)) {
            d[name] = 0;
        }        
        var f, r, t = d[name], v = parent.prototype;
        if (t) {
            while (t) {
                v = v.constructor.prototype;
                t -= 1;
            }
            f = v[name];
        } else {
            f = p[name];
            if (f == this[name]) {
                f = v[name];
            }
        }
        d[name] += 1;
        r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
        d[name] -= 1;
        return r;
    });
    return this;
});

var Rectangle = function(width, height) {
    this.width = width;
    this.height = height;
};

Rectangle.method('area', function () {
    return this.width * this.height;
});

var myRect = new Rectangle(2, 2);
window.console.log('myRect area is %d', myRect.area()); // returns 4

var Square = function(size) {
     this.width = this.height = size;
};

Square.inherits(Rectangle);

var mySquare = new Square(4);
window.console.log('mySquare area is %d', mySquare.area()); // returns 16