Как добиться псевдоклассического наследования права на объявление класса?
Замечания:
Как показывают ответы, предложенный в вопросе кодНЕ действительно получить наследство (иначе это становится ответом, а не вопросом ..) из-за некоторых проблем, описанных в вопросе и в моих комментариях. Работает как положеноподделка наследование (и даже не прототип).
Резюме
Короче говоря, сделайте его таким же, как мы пишем общий язык ОО, а не 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