Как добиться псевдоклассического наследования права на объявление класса?

Замечания:

Как показывают ответы, предложенный в вопросе кодНЕ действительно получить наследство (иначе это становится ответом, а не вопросом ..) из-за некоторых проблем, описанных в вопросе и в моих комментариях. Работает как положеноподделка наследование (и даже не прототип).

Резюме

Короче говоря, сделайте его таким же, как мы пишем общий язык ОО, а не javascript, но сохраняйте правильность наследования.

История

Object.create хороший способ достичь наследования прототипа, но этонемного сбивает с толкунабранный мозг иновый фанаты.

Существуют различные способы, которыми мы можем писать код javascript, как будто мы пишем другие ОО-языки с псевдоклассическим шаблоном. Как этопсевдо-классический, мы должны правильно разобраться с базовым наследованием прототипов javascript.

То, что я хочу найти, - это подход к достижению псевдоклассического наследования.прямо на объявление класса, Код для демонстрации размещен в задней части поста, он работает как положено, однако есть некоторые неприятные вещи:

Я не могу избавиться отreturn в объявлении класса или наследство выигралт работа.

У меня нет пути, кроме проходаthis в объявлении класса, чтобы сделать возвращающее замыкание знать, что есть.this

Я также хочу избавиться отfunction (instance, _super) {, но еще не есть хорошая идея.

статический(собственные свойства) класса не наследуются.

Решение было бы больше синтаксического сахара, чем существующие рамки, хороший шаблон применим.

_extends функция:

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;
    };
}

Abc учебный класс:

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;
    });
}

Xyz учебный класс:

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

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

Пример кода:

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

Ответы на вопрос(5)

Ваш ответ на вопрос