Путаница, возникающая из этой главы книги Крокфорда, возникает из-за того, что Крокфорд описывает «свой» предпочтительный шаблон для реализации наследования в JavaScript, который основан на расширении объекта Function
с помощью Function.prototype.method
(глава 1.3), который он использует для добавления методов к объекту Function.
Проблема, решаемая в примере coolcat
, заключается в необходимости доступа к методу родительского типа. В «классических» ОО-языках, таких как Java, это естественно, поскольку классы существуют сами по себе. В JavaScript наследование является прототипом, вы создаете объект типа mammal
, а затем изменяете объект для создания типа cat
или coolcat
.
В зависимости от вашего дизайна вы можете добавить свойства и функции или переопределить «унаследованную» функцию. Проблема возникает, когда вы переопределяете «унаследованную» функцию, в JavaScript вы в основном заменяете старую функцию новой, тем самым теряя старую функцию.
Крокфорду теперь нужно сделать две вещи:
- получить метод родителя (кошки)
get_name
; и
- сохраните его так, чтобы его можно было использовать из переопределенного метода.
В этом коде:
var coolcat = function(spec) {
var that = cat(spec),
super_get_name = that.superior('get_name');
that.get_name = function(n) {
return 'like ' + super_get_name() + ' baby';
};
return that;
};
Он делает 1., вызывая вышестоящий метод, чтобы получить функцию, которая получает функцию кошки get_name
;
и он делает 2., сохраняя его в переменной super_get_name
в функции coolcat (/ object), предоставляя доступ к функции кошки get_name
до того, как она будет переопределена (более правильно перезаписана) функцией coolcat get_name
.
На мой взгляд, путаница возникает из-за:
- Метод
superior
назван странно: «улучшенный» метод - это просто функция, ищущая по имени метод, и его можно было бы назвать лучше, например, getFunctionByName
(вы можете попробовать это с помощью заменив строку get_name
на purr
, get_name для coolcat теперь будет вызывать purr, просто не забудьте назвать ее как super_get_name(10)
, иначе вы получите пустую строку).
- Во-вторых, код и паттерн запутывают код, опираясь на некоторые конкретные паттерны Крокфорда, и, скорее всего, будут вас напрягать, если вы попытаетесь погрузиться в эту главу, не следуя всей книге.
Я думаю, что есть более простой способ достичь этого, я думаю, потому что он полностью локализован, легче понять и т. Д., Как в коде ниже:
var coolcat = function(spec) {
var that = cat(spec);
that.parent_get_name = that.get_name;
that.get_name = function() {
return 'like ' + this.parent_get_name() + ' baby';
};
return that;
};
Существуют и другие странности, например, аргумент n
в определении функции coolcat get_name
, который я могу предположить только из-за копирования функции мурлыканья, которая может предложить автора-призрака!
Наконец, я хотел бы предложить, чтобы, прежде чем кто-то прочитал книгу, он прослушал его выступление на тему «JavaScript - хорошие части». Беседа совершенно блестящая, намного лучше, чем книга.