JSFiddle - React, Tailwind, and code Playground
HTML
<textarea rows="30" cols="80">var Square = new Class(function (ctor, uber) {
*ctor = constructor;
var side;
function constructor(length) {
side = length;
}
this.area = function () {
return side * side;
};
return &uber;
});
var Cube = new Class(function (ctor, uber) {
*ctor = constructor;
function constructor(side) {
uber(side);
}
this.area = function () {
return 6 * uber.area();
};
return &uber;
}, Square);
var cube = new Cube(5);
alert(cube.area());
function Class(claus, Uber) {
Claus.__proto__ = Uber === void 0 ? Class.prototype : Uber;
return Claus;
function Claus() {
var self = this;
var called;
var uber = Uber === void 0 ? function () {
throw new Error("No uber class specified.");
} : function () {
if (!called) {
called = "Cannot call uber class constructor more than once.";
var args = Array.prototype.slice.call(arguments);
args = Array.prototype.concat.call([null], args);
var base = new (Function.prototype.bind.apply(Uber, args));
self.__proto__.__proto__ = base;
self.__proto__.__proto__.constructor = Claus;
*uber = base;
} else throw new Error(called);
};
var constructor = new Function;
uber = claus.call(this, &constructor, uber);
constructor.apply(this, arguments);
};
}</textarea><button>Run</button>
JavaScript
var textarea = document.getElementsByTagName("textarea")[0];
var button = document.getElementsByTagName("button")[0];
button.addEventListener("click", function () {
var script = textarea.value.replace(/&([$A-Z_][$0-9A-Z_]*)/gi, (function () {
var pointer = new String("function(value){if(value===void 0)return upvalue;else upvalue=value;}");
return function (value, identifier) {return pointer.replace(/upvalue/g, identifier);};
}()));
script = script.replace(/\*([$A-Z_][$0-9A-Z_]*)\s*(=|\+=|-=|\*=|\/=|%=|&=|\|=|\^=|<<=|>>=|>>>=)\s*(.*);/gi, function (value, identifier, operator, expression) {
if (operator === "=") return identifier + "(" + expression + ");";
else return identifier + "(" + identifier + "()" + operator.slice(0, -1) + "(" + expression + "));";
});
script = script.replace(/\*([$A-Z_][$0-9A-Z_]*)/gi, function (value, identifier) {return identifier + "()";});
try {Function.call(null, script)();}
catch (error) {alert(error);}
}, false);