Javascript: Как я могу выполнить код при вызове функции без перезаписи этой функции? - PullRequest
1 голос
/ 28 октября 2010

Итак, я хотел бы, чтобы какой-то код выполнялся при каждом вызове данной функции, это выполнимо? Дело в том, что я мог бы просто перезаписать существующую функцию и добавить код, но это потребовало бы, чтобы я знал точное содержание этой функции ... Представьте «плагин» для «библиотеки», и вы хотите, чтобы плагин для выполнения кода каждый раз, когда вызывается определенная функция этого библиотеки, но вы не хотите перезаписывать исходное содержимое библиотеки ... Надеюсь, я достаточно ясен!

А если это выполнимо, есть ли способ получить аргументы, переданные функции?

Ответы [ 4 ]

3 голосов
/ 28 октября 2010

Для меня это звучит как работа для функции-оболочки.

Напишите функцию, которая вызывает другую функцию, и поместите свой код в конец этого (или где-либо еще). Тогда всегда называйте свою версию.

Сортировка шаблона адаптера. http://en.wikipedia.org/wiki/Adapter_pattern

Я полагаю, что вы можете скрыть область действия исходной функции и назвать ее так же, если не можете изменить вызывающий код (не работает с некоторыми встроенными функциями, такими как alert, но должен работать для кода библиотеки). Если это не вариант, посмотрите, позволит ли прототип расширить объект для добавления функциональности. http://phrogz.net/js/classes/ExtendingJavaScriptObjectsAndClasses.html

    //Only add this implementation if one does not already exist. 
if (Array.prototype.slice==null) Array.prototype.slice=function(start,end){ 
   if (start<0) start=this.length+start; //'this' refers to the object to which the prototype is applied 
   if (end==null) end=this.length;
   else if (end<0) end=this.length+end;
   var newArray=[];
   for (var ct=0,i=start;i<end;i++) newArray[ct++]=this[i];
   return newArray;
}

В качестве аргументов вы также можете сделать так, чтобы ваша версия принимала необязательные аргументы (аналогичные jQuery / MooTools), а затем посмотрите, что было передано.

Примеры необязательных аргументов здесь. http://www.openjs.com/articles/optional_function_arguments.php

function accident() {
    for( var i = 0; i < arguments.length; i++ ) {
        alert("This accident was caused by " + arguments[i]);
    }
}
1 голос
/ 28 октября 2010

Это определенно выполнимо.JS - это динамический язык, поэтому вы можете заменить функцию, хранящуюся в объекте, на свою.Например:

var fxnToWrap = obj.someFunction;
obj.someFunction = function() {
    console.log("booyah, I'm intercepting every call to obj.someFunction");
    fxnToWrap.apply(obj, arguments);
}
1 голос
/ 28 октября 2010

Возможно, вы могли бы перезаписать ссылку на функцию? Например:

function add1(x) { return x + 1; }
function log_calls(f, name) {
    return function() {
        console.log("got a call to", name, "with args", arguments);
        return f.apply(null, arguments);
    }
}
add1 = log_calls(add1, "add1");

Тогда вызовы add1 будут выглядеть примерно так:

>> x = add1(42)
"got call to add1 with args [42]"
>> x
43
0 голосов
/ 28 октября 2010

Отредактировано для исправления ошибки, указанной в комментарии

Это может решить вашу проблему:

function f() {alert("in f");}
var saved_f = f;
var f = function() {
  alert("in f2");
  saved_f();
}
f();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...