JSFiddle - React, Tailwind, and code Playground

JavaScript

// console.log was replaced with document.write;


    'use strict'; //criteria 5

    function Class() {}
    Class.extend = function (constructor, definition) {
        var key, hasOwn = {}.hasOwnProperty, proto = this.prototype, temp, Extended;

        if (typeof constructor !== 'function') {
            temp = constructor;
            constructor = definition || function () {};
            definition = temp;
        }
        definition = definition || {};

        Extended = constructor;
        Extended.prototype = new this();

        for (key in definition) {
            if (hasOwn.call(definition, key)) {
                Extended.prototype[key] = definition[key];
            }
        }

        Extended.prototype.constructor = Extended;

        for (key in this) {
            if (hasOwn.call(this, key)) {
                Extended[key] = this[key];
            }
        }
        
        Extended.$super = proto;
        return Extended;
    };

    //criteria 3:
    var A = Class.extend(function A () {}, {
        foo: function (n) { return n;}
    });
    var B = A.extend(function B () {}, {
        foo: function (n) {
            if (n > 100) return -1;
            return B.$super.foo.call(this, n+1);
        }
    });
    var C = B.extend(function C () {}, {
        foo: function (n) {
            return C.$super.foo.call(this, n+2);
        }
    });
    
    //criteria 2:
    var c = new C();
    document.write(c.foo(0) + '<br>'); //3

    //criteria 1:
    A.prototype.foo = function(n) { return -n; };
    document.write(c.foo(0)); //-3


document.write('<br>');
//same thing with privileged functions

    //criteria 3:
    var A2 = Class.extend(function A2 () {
        this.foo = function (n) {
            return n;
        };
    });
    var B2 = A2.extend(function B2 () {
        B2.$super.constructor(); 
        this.foo = function (n) {
            if (n > 100) return -1;
            return B2.$super.foo.call(this, n+1);
        };
    });
  ...