¿Cómo lograr la herencia pseudo-clásica en la declaración de clase?

Nota:

Como dicen las respuestas, el código propuesto en la pregunta haceNO realmente lograr la herencia (de lo contrario se convierte en una respuesta en lugar de una pregunta ...) debido a algunos problemas descritos en la pregunta y en mis comentarios. Funciona como se espera comouna falsificación de Herencia (y ni siquiera prototípica).

Resumen

En resumen, haga que sea tan similar como estamos escribiendo un lenguaje OO general en lugar de javascript, pero mantenga la herencia correcta.

La historia

Object.create es una buena manera de lograr la herencia prototípica, pero es un poco confuso para unmecanografiado cerebro ynuevo aficionados.

Hay varias formas en las que podemos escribir código javascript más como si estuviéramos escribiendo otros lenguajes OO con el patrón pseudo-clásico. Como suseudo- Clásico, debemos lidiar con la herencia prototípica subyacente de javascript correctamente.

Lo que quiero encontrar es un enfoque que permita lograr la herencia pseudo-clásica.justo en la declaración de clase. El código de demostración se coloca en la parte posterior de la publicación, funciona como se esperaba, sin embargo, hay algunas cosas molestas:

No puedo deshacerme dereturn En la declaración de clase o la herencia no funcionará.

No tengo más remedio que pasar.this en la declaración de clase para hacer que el cierre de retorno sepa lo que esthis.

También quiero deshacerme defunction (instance, _super) {, pero aun no tengo una buena idea.

losestático(propiedades propias) de una clase no se heredan.

Una solución sería más de un poco de azúcar sintáctica que los marcos existentes, un buen patrón es aplicable.

los_extends función:

function _extends(baseType) {
    return function (definition) {
        var caller=arguments.callee.caller;
        var instance=this;

        if(!(instance instanceof baseType)) {
            (caller.prototype=new baseType()).constructor=caller;
            instance=new caller();
        }

        var _super=function () {
            baseType.apply(instance, arguments);
        };

        definition(instance, _super);
        return instance;
    };
}

losAbc clase:

function Abc(key, value) {
    return _extends(Object).call(this, function (instance, _super) {
        instance.What=function () {
            alert('What');
        };

        instance.getValue=function () {
            return 333+Number(value);
        };

        instance.Value=instance.getValue();
        instance.Key=key;
    });
}

losXyz clase:

function Xyz(key, value) {
    return _extends(Abc).call(this, function (instance, _super) {
        _super(key, value);

        instance.That=function () {
            alert('That');
        };
    });
}

Código de ejemplo:

var x=new Xyz('x', '123');
alert([x.Key, x.Value].join(': ')+'; isAbc: '+(x instanceof Abc));

var y=new Xyz('y', '456');
alert([y.Key, y.Value].join(': ')+'; isAbc: '+(y instanceof Abc));

var it=new Abc('it', '789');
alert([it.Key, it.Value].join(': ')+'; isAbc: '+(it instanceof Abc));
alert([it.Key, it.Value].join(': ')+'; isXyz: '+(it instanceof Xyz));

x.What();
y.That();

it.What();
it.That(); // will throw; it is not Xyz and does not have That method

Respuestas a la pregunta(5)

Su respuesta a la pregunta