Общая техника цепи для перегруженного метода
https://softwareengineering.stackexchange.com/questions/204557
-
29-09-2020 - |
Вопрос
Общая работа в JavaScript - заменить метод объекта с новым, пока все еще вызывает оригинальный метод.Это часто делается подобным:
var originalMethod = obj.method;
obj.method = function(arg) {
// call original method
originalMethod.call(this, arg);
// do my stuff new stuff
}
.
Я хотел бы создать функцию утилиты для конкретного объекта метода, который обрабатывает часть цепочки, чтобы пользователь не нужно беспокоиться об этом.Одним из вариантов является использование вышеуказанного дизайна, в которой каждая добавленная функция завернута в новую функцию, которая вызывает предыдущую.Другой вариант состоит в том, чтобы создать массив функций и сделать метод объекта, просто повторяющуюся над массивом, вызывая каждую функцию в свою очередь.
function addXyzMethod1(fn) {
if (obj.method) {
var previousMethod = obj.method;
obj.method = function(value) {
value = previousMethod.call(this, value);
return fn.call(this, value);
};
} else {
obj.method = fn;
}
}
function addXyzMethod2(fn) {
if (obj._methodList) {
obj._methodList.push(fn);
} else if (obj.method) {
obj._methodList = [obj.method, fn];
obj.method = function(value) {
for (var i = 0, n = obj._methodList.length; i < n; i++) {
value = obj._methodList[i].call(this, value);
}
return value;
};
} else {
obj.method = fn;
}
}
.
На данный момент я не могу решить, какой метод использовать, так как я чувствую, что компромиссы каждая даже даже.Итак, мой вопрос здесь: какой из этих методов лучше (более естественный или принятый или быстрее) или есть другой метод, который улучшается на обоих этих?
Решение
Этот вопрос вполне похоже, или, по крайней мере, сводится к аналогичному вопросу здесь: https://stackoverflow.com/questions/660337 / a>
Другие советы
What you are trying to do is a JavaScript version of call super, which is described as a code smell by Martin Fowler.
I would suggest instead that you either
- Contain the "super" object instead of inheriting from it.
Use template method, such as below
templateMethod = function () { baseMethod(); if (overrideMethod) { overrideMethod(); } };
Other objects would call templateMethod. The overrideMethod is where child objects would have their code.