Lightweight class model

JavaScript

var Base = {
    create: function () {
        var object = Object.create(this);
        if (typeof object.constructor == 'function') {
            object.constructor.apply(object, arguments);
        }
        return object;
    },
    extends: function (properties) {
        var Child = Object.create(this);
        for (var p in properties) {
            Child[p] = properties[p];
        }
        return Child;
    }
};

var Item = Base.extends({
    constructor: function (content) {
        this.content = content;
    },
    foo: function () {
        return 42;
    }
});

var ComplexItem = Item.extends({
    constructor: function (content, size) {
      Item.constructor.call(this, content);
      this.size = size;
    },
    foo: function () {
         return Item.foo.call(this) + 2;
    }
});

var item = Item.create('yop');
var complexItem = ComplexItem.create('youp', 53);

console.log(item);
console.log(complexItem);
console.log(item.foo());
console.log(complexItem.foo());
console.log(ComplexItem.isPrototypeOf(item));
console.log(ComplexItem.isPrototypeOf(complexItem));