Javascript Паразитарное Наследование - PullRequest
7 голосов
/ 31 августа 2011

Я борюсь с 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'

1 Ответ

2 голосов
/ 31 августа 2011

Вы можете изменить прототип Parenizor, чтобы он имел функцию убер, и он будет работать с любым другим значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...