А теперь получается, что первый аргумент - имя класса, третий - прототип, а второй - свалка для всего остального, отчасти это статические свойства, отчасти параметры для функции. Я бы тогда поместил статические свойства в отдельный параметр и убрал двойное подчеркивание:
Class("Foo", {
context: window,
extends: "Bar",
implements: [ "IBase", "IPersistent" ],
static: {
STATIC_PARAM: 1,
STATIC_CONST: "lala"}
}, {
// code
});
Кстати, можно как-то в прототипе указать конструктор? Или надо для этого указывать функцию вместо объекта?
Ну и, предыдущий интерфейс остался же? Я считаю, не стоит стремится всем угодить.
P.S. Я не очень старался, но я не въехал в код угадывания какой входной параметр что обозначает.