Примечание:
Как говорят ответы, код, предложенный в вопросе, действительно НЕ действительно наследует (в противном случае это становится ответом, а не вопросом..) из-за некоторых проблем, описанных в вопросе и в моем Комментарии. Он работает как ожидаемый подделка наследования (и даже не прототипа).
-
Резюме
Короче говоря, сделайте его похожим на то, что мы пишем общий язык OO, а не javascript, но сохраняем правильность наследования.
-
История
Object.create - это хороший способ достижения прототипного наследования, но он немного запутан в умении напечатал и новом.
Существуют различные способы написания javascript-кода, как мы пишем другие языки OO с псевдоклассическим шаблоном. Поскольку он псевдо -классический, мы должны правильно относиться к базовому прототипному наследованию javascript.
То, что я хочу найти, - это подход, согласно которому псевдоклассическое наследование может быть достигнуто прямо в объявлении класса. Код для демонстрации помещен в тыл сообщения, он работает так, как ожидалось, однако есть некоторые неприятные вещи:
-
Я не могу избавиться от
return
в объявлении класса или наследование не будет работать. -
У меня нет способа, кроме pass
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