Как вызвать метод объекта-предка из метода объекта-потомка?
Проблема
Есть пользовательский объект, созданный на основе другого объекта. Этот
объект содержит метод, унаследованный от объекта-предка, но переопределенный в
его собственной реализации. (Как мы уже знаем, это достигается присвоением
другой функции соответствующему свойству объекта-потомка.) Можно ли из
переопределенного метода потомка как-то вызвать изначальный метод предка?
Решение
Одно из ограничений языка JavaScript — невозможность стандартными средствами
обратиться к изначальному методу объекта-предка из переопределенного метода
потомка. Однако можно использовать несложный трюк, описанный далее.
1. В определении объекта-потомка создаем еще одно свойство и называем
его, скажем, ПО такой схеме: <Имя объекта-предка>_<Имя
переопределяемого метода>.
2. Присваиваем этому свойству значение свойства, соответствующего
переопределяемому методу.
3. Присваиваем свойству, соответствующему переопределяемому
методу, функцию, содержащую новую реализацию этого метода.
4. Если нам понадобится обратиться к изначальному методу предка, мы
просто вызываем его, пользуясь созданным ранее свойством <Имя объекта-
предка>_<Имя переопределяемого метода>.
Пример
Давайте перепишем определение объекта point2 так, чтобы функция fsetcoords2,
заносящая в свойства х и у значения координат, использовала для этого "старую"
функцию fsetcoords.
// Объявление функции-конструктора объекта Point2 function Point2(ix, iy,
icolor) {
this.base = Point; this.base(ix, iy) ; this.color = icolor;
this.Point_setCoords = this.setCoords; this.setCoords = fSetCoords2; }
// Выражение, делающее объект Point предком объекта Point2 Point2.prototype =
new Point;
// Объявление функции, реализующей метод setCoords объекта Point2 function
fSetCoords2(ix, iy) {
this.Point_setCoords(ix, iy); this.color = 0; }
Народ советует
Несмотря, скажем так, на особенности реализации в JavaScript, использование
изначальных методов объектов-предков может сильно упростить код методов
объектов-потомков. Тем более что полностью изменять реализацию переопределяемых
методов приходится очень редко — чаще их нужно только слегка подправить.
Как добавить новые свойства и методы в уже существующий объект?
Проблема
Я написал отличную функцию по работе со строками. Нельзя ли добавить ее к уже
существующему объекту string в качестве метода?
Решение
Ничего нет проще! Синтаксис создания нового свойства или метода для уже
существующего объекта таков:
<Объект>.prototype.<Имя свойства> = <3начение
свойства>;
<Объект>.prototype.<Имя метода> = <Функция, реализующая этот
метод>;
Народ предупреждает!
Описанным выше способом можно добавить новые свойства и методы только во
встроенные объекты JavaScript (Number, string, Object и пр.). Объекты
Web-обозревателя (document, window, navigator и пр.) таким образом расширить
нельзя.
Пример
Далее в этой книге будут приведены листинги методов trimLeft и trimRight,
удаляющие из строк начальные и конечные пробелы соответственно. Для добавления
этих методов к объекту string были использованы следующие выражения:
String.prototype.trimLeft = mjspsTrimLeft; String.prototype.trimRight =
mjspsTrimRight;
Здесь mjspsTrimLeft и mjspsTrimRight— функции, реализующие эти методы (они
будут описаны далее).
Как в теле метода, добавленного к объекту String, Number или Boolean,
получить доступ к значению этого объекта?
Проблема
Я пишу метод, который собираюсь добавить к стандартному объекту JavaScript
(string, Number или Boolean). Как мне в этом методе получить текущее значение
этого объекта (строку, число или логическую величину)?
Решение
Общий формат выражения для получения текущего значения стандартного объекта
JavaScript в теле метода этого объекта таков:
<Переменная> = new <Имя стандартного объекта>(this);
Пример
Вот фрагмент объявления функции, которая впоследствии станет методом объекта
Number: function mSomeMethod() {
var objValue = new Number(this);
}
В результате вычисления приведенного выше единственного выражения в
переменной objvalue окажется числовое значение, содержащееся в экземпляре
объекта Number, т. е. в числовой переменной.