Pull to refresh
6
0
Александр @Mavim

User

Send message
второй вариант на c подключенным mootools.js тоже не работает ;)
Parent1 = new Class({
  message: function() {
    return 'Parent1::message';
  }
});

Parent2 = new Class({
  message: function() {
    return 'Parent2::message';
  }
});

Child12 = new Class({
  Implements: [ Parent1, Parent2 ],

  message: function() {
    // вызов по очереди одноименного метода всех родительских классов
    var message = Parent1.message.call(this) + "\n";
    message += Parent2.message.call(this) + "\n";
    message += 'Child12::message'
    return message;
  }
});

myChild = new Child12();
alert(myChild.message());

дает ту же ошибку, в принципе ожидаемо:
Error: Parent1.message is undefined
и кстати, прототипом для такого метода наследования послужил как раз Ваш неработающий вариант, а потом стало интересно поковыряться
Это лучше, чем кляньчить инвайты у знакомых ;)
К тому же, вроде ничего подобного я не встречал, может надо было в «Ненормальное программирование»?
но с другой стороны, в моей реализации конструктор ExtClass должен быть вызван для записи родительских классов и их методов, решение требует напильника, но я не JS-ник, чтоб сильно заморачиваться
да, и это недостаток
вообще, я дышу ровно, но есть вероятность наложений, если править прототипы базовых объектов, к примеру, я использую библиотеку mootools.js и superlibrary.js (все совпадения имен случайны )), если мы на прототип Array навешиваем indexOf, то в mootols, к примеру, если элемент не найден, возвращается -1, а в superlibrary -2 (а -1 зарезервирован для другого послания).
Так вот, если добавлять в прототип через проверку на существование метода indexOf, то тут зависит от того, какая библиотека подключена первой, а если без проверки, то какая последней, в любом из этих случаев другая библиотека перестанет функционировать корректно
На самом деле из «ужасного» я вижу только «корявость» вызова родительского метода, можно обернуть в метод:
this.parent = function(parentName, methodName, ...args...) {
  ...
};


причем, имеем преимущество в том, что обращаться из люого метода потомка можно к любому методу любого родителя
function Parent1() {
this.message = function() {
return 'Parent1::message';
};
};

function Parent2() {
this.message = function() {
return 'Parent2::message';
};
};

function Child12() {
Parent1.call(this);
Parent2.call(this);
this.message = function() {
var message = Parent1.message.call(this) + "\n";
message += Parent2.message.call(this) + "\n";
message += 'Child12::message'
return message;
};
};

var test = new Child12();
alert(test.message());

>> Первый — без обёрток:
Error: Parent1.message is undefined
по-поводу mootools.js, проверил, там нет некоторых побочных артефактов, присущих ajaxoop.js
по-моему, я его «сбрил» за схожесть синтаксиса наследования с ajaxoop.js, который «правил» свойство всех объектов родительского класса при измении свойства объекта наследуемого класса.
мне это все было не нужно, хотя ядро его можно глянуть ради интереса, времени как всегда в обрез
>> Лучше, чем?
эммм… тем, что мой код работает ;)

>> Или
habrahabr.ru/blogs/javascript/128000/#comment_4227627
ок, 86 кб ради наследования?
* в переписанном методе класса-наследника
да, это приятный побочный эффект )
на деле не использовал его, просто пример привел, что возможно + все методы всех родителей доступны
mootools тоже смотрел, не очень он мне нравится, что-то было с ним не так, уже не вспомню, я месяца 3 назад это наваял. Кстати, не заметил там возможности вызова родительского метода в классе-наследнике.
12 ...
8

Information

Rating
Does not participate
Location
Россия
Registered
Activity