Показаны сообщения с ярлыком function. Показать все сообщения
Показаны сообщения с ярлыком function. Показать все сообщения
понедельник, 19 сентября 2011 г.

Как в javascript переименовать функцию

Переименовать уже существующую функцию не так-то просто. Но возможно:
// при помощи этой функции будем переименовывать
Object.defineProperty(
    Object.prototype, 
    'renameProperty',
    {
        writable : false, // Cannot alter this property
        enumerable : false, // Will not show up in a for-in loop.
        configurable : false, // Cannot be deleted via the delete operator
        value : function (oldName, newName) {
            // Check for the old property name to 
            // avoid a ReferenceError in strict mode.
            if (this.hasOwnProperty(oldName)) {
                this[newName] = this[oldName];
                delete this[oldName];
            }
            return this;
        }
    }
);

// сам пример. переименовываем функцию NIRV.repaintMain в NIRV.repaintMain2
NIRV.renameProperty("repaintMain", "repaintMain2");
NIRV.repaintMain = function() {
  NIRV.repaintMain2();
  $("li.task.completed").each(AddReaddButton);
};
Этот вариант может не везде работать. Я его взял здесь. Там есть и другая функция для переименования.
среда, 31 августа 2011 г.

Как в javascript обернуть функцию

Однажды мне для юзерскрипта потребовалось обернуть функцию. Вот есть функция repaintMain. Мне нужно обернуть ее, т.е. чтобы когда она вызывается, то сперва бы вызывался ее оригинальный код, а потом мой.

Оказывается, в джаваскрипте это делается довольно просто:
repaintMain2 = repaintMain;
repaintMain = function() {
  repaintMain2.apply(this, arguments);;
  $("li.task.completed").each(AddReaddButton);
};
Узнал об этом способе здесь.

Еще есть способ оборачивания через переименование функции.

Кроме того, есть довольно продвинутые способы оборачивания функции. Которыми можно пользоваться вот так:
var beforeExecute = function() { ... }
var afterExecute = function() { ... }

myFunc = wrap(myFunc, beforeExecute, afterExecute);