Я борюсь с Javascript классическим наследованием 1 . Хотя, в конце концов, Дуглас Крокфорд отвергает свои первые попытки поддержать классическую модель в Javascript, мне интересно понять:
Я пишу JavaScript уже 8 лет, и я ни разу не нашел необходимости использовать функцию uber. Супер идея довольно важна в классическом паттерне, но кажется, что она не нужна в прототипе и функциональных паттернах. Теперь я вижу свои ранние попытки поддержать классическую модель в JavaScript ошибкой.
Тем не менее, есть кое-что не совсем понятное для того, что касается Паразитического наследования :
function ZParenizor2(value) {
var that = new Parenizor(value);
that.toString = function () {
if (this.getValue()) {
return this.uber('toString');
}
return "-0-"
};
return that;
}
З. Паренизор, насколько я понял, определяется в терминах Паренизор. Но Паренизор - это базовый класс, и он ни от кого не наследует. Таким образом, функция this.uber
не будет определена, и фактически у меня возникает ошибка при вызове метода toString
нового объекта ZParenizor2.
Я прав или я что-то игнорирую?
UPDATE
Я был прав. Этот метод работает только тогда, когда вы создаете ZParenizor с 0 в качестве параметра, поскольку ему не нужно вызывать метод uber
(как вы можете видеть из описания реализации метода).
Когда вы пытаетесь с другим параметром, я получаю эту ошибку:
Uncaught TypeError: Object #<error> has no method 'uber'