Показать сообщение отдельно
  #41 (permalink)  
Старый 28.08.2009, 18:03
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

B~Vladi,
Если будешь продолжать общение на форуме в таком ключе (не только в этой теме, а вообще), будет бан.

JSprog,
Эта функция связывает через пустой конструктор конструкторы Child и Parent цепочкой прототипов:
function extend(Child, Parent) {
    // Поскольку мы не можем просто указать Child.prototype = Parent.prototype
    // ведь это просто передаст ссылку на родительский прототип,
    // и редактирование Child.prototype приведет к изменениям и в Parent.prototype.
    // Поэтому мы создадим пустой конструктор:
    var F = function() { }
    // Прототипом которого укажем Parent.prototype (наследуем свойства Parent):
    F.prototype = Parent.prototype
    // А для Child "отнаследуем" этот пустой конструктор (укажем прототипом объект этого конструктора),
    // и теперь редактирование Child.prototype не затронет Parent.prototype:
    Child.prototype = new F()
    // Теперь мы связали Child и Parent, через "пустой" конструктор F,
    // осталось только восстановить ссылку на конструктор для Child:
    Child.prototype.constructor = Child
    // А это просто сахар:
    Child.superclass = Parent.prototype    
}


Еще наверно нужно добавить, что эта функция связывает два конструктора таким образом, чтоб при объявлении прототипом Child объекта Parent, не приходилось вызывать его конструктор, т.е. в стандартном виде:
Child.prototype = new Parent();

Делает тоже самое, но заставляет исполниться конструктор Parent, что, в большинстве случаев, неудобно.
В этом коде мы заменяем Parent на пустой конструктор, который имеет такой же прототип, как и Parent, но при его вызове, не выполняет никакой инициализации.

Последний раз редактировалось Андрей Параничев, 28.08.2009 в 18:17.
Ответить с цитированием