LINUX.ORG.RU

Замена метода объекта javascript обёрткой

 


0

1

Пусть есть некий класс A, который вы не имеете возможности изменить:

function A () {
  this.x = 1;
}

A.prototype.f = function () {
  this.x = 2;
}

И требуется дописать некий код в конец метода A.f (не изменяя исходный код, только дополняя). Допустим, надо добавить

this.y = 3;

Я делаю так:

var save_f = A.prototype.f;
A.prototype.f = function () {
    this.save_f = save_f;
    this.save_f();
    delete this.save_f;
    this.y = 3;
}

Теперь

var a = new A();
a.f();
a.x; // == 2
a.y; // == 3

Не слишком ли корявое это решение, и можно ли сделать это как-то по-другому?

JavaScript не знаю, но зачем нужна переменная save_f, почему нельзя сразу сохранить старый метод f в поле прототипа?

A.prototype.save_f = A.prototype.f;
A.prototype.f = function () {
    this.save_f();
    this.y = 3;
}
Begemoth ★★★★★
()

Решение корявое, но потому что сама задача неправильная, надо класс переписывать или архитектуру пересметривать.

А если ты пишешь юзерскрипт какой-нибудь, посмотри апи браузеров, у оперы по крайней мере точно были инструменты для перехватывания вызовов функций родного кода.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Да, это манки-патчинг. Ну а щито поделать, десу.

discordia
() автор топика
Ответ на: комментарий от Kalashnikov

Решение корявое, но потому что сама задача неправильная, надо класс переписывать или архитектуру пересметривать.

ваши варианты? полиморфизм - вполне себе стандартная вещь в архитектуре.

dib2 ★★★★★
()
Ответ на: комментарий от discordia

когда надоест перечислять аргументы руками (про variadic argument list вообще молчу) - вернешься на apply :)

dib2 ★★★★★
()
Ответ на: комментарий от Kalashnikov

Что за жалкий высер?

вы про это:

класс переписывать или архитектуру пересметривать.

?

Это не полиморфизм.

ну да, конечно.

dib2 ★★★★★
()

можно в поле ничего не записывать а делать так var func = A.prototype.func; A.prototype.func = function() { func.apply(this, arguments); this.do_some_shit = 123; }

Прочитай про apply, call и bind

wwwsevolod
()
Ответ на: комментарий от dib2

полиморфизм - вполне себе стандартная вещь в архитектуре.

а где тут полиморфизм?

RedPossum ★★★★★
()

Ох, туплю, не вчитался в топик, что он не наследует, а просто меняет поведение. Сори за бугурт, надо брать отпуск :)

dib2 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.