I can rewrite it so:
```javascript
var inherit = Object.create || (function () {
    var F = function () {};

    return function (o) {
        if (arguments.length > 1) {
          throw Error('Second argument not supported');
        }
        if (o === null) {
          throw Error('Cannot set a null [[Prototype]]');
        }
        if (typeof o != 'object') {
          throw TypeError('Argument must be an object');
        }

        F.prototype = o;

        return new F();
    };
})();

AbstractGrader.extend = function (protoProps) {
    var Parent = this,
        Child = function () {
            if ($.isFunction(this.initialize)) {
                return this.initialize.apply(this, arguments);
            }
        };

    // Inherit methods and properties from the Parent prototype.
    Child.prototype = inherit(Parent.prototype);
    Child.constructor = Parent;
    // Provide access to parent's methods and properties 
    Child.__super__ = Parent.prototype;

    // Extends inherited methods and properties by methods/properties
    // passed as argument.
    if (protoProps) {
        $.extend(Child.prototype, protoProps);
    }

    return Child;
};
```
What do you think?