Как проксировать функции на функции в JavaScript? - PullRequest
1 голос
/ 05 марта 2012

Я новичок в javascript. Так что я не знаю, какое имя я ищу и как мне это сделать?

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

Я использую console.log для отладки, но это вызывает ошибку, если браузер IE. Я сделал ниже функцию для этой проблемы.

var mylog=function(){
   if (devmode && window.console){
      console.log(arguments);
   }
};

mylog("debugging");

Теперь я хочу использовать все функции консоли без ошибок, и я могу сделать это, как показано ниже.

var myconsole={
   log:function(){
        if (devmode && window.console){
          console.log(arguments);
       }
   }
   ,error:function(){
        if (devmode && window.console){
          console.error(arguments);
       }
   }

  ...
  ...
  ...


};

Но я не хочу добавлять все функции консоли к объекту myconsole по отдельности. Я могу сделать это в PHP с кодом ниже.

class MyConsole
{
  function __call($func,$args)
  {
     if ($devmode && function_exists('Console')){
        Console::$func($args); // Suppose that there is Console class.
     }   
  }
}

MyConsole::warn("name",$name);
MyConsole::error("lastname",$lastname);

Это возможно с помощью метода __noSuchMethod__, но это относится только к Firefox.

Спасибо за помощь.

1 Ответ

1 голос
/ 05 марта 2012

К сожалению, вы не можете сделать это в JavaScript, язык не поддерживает концепцию «нет такого метода».

Два варианта для вас:

Вариант 1:

Используйте строки для имени вашего метода, например ::100100

function myconsole(method) {
    var args;

    if (devmode && window.console) {
        args = Array.prototype.slice.apply(arguments, 1);
        window.console[method].apply(window.console, args);
    }
}

Использование:

myconsole("log", "message");
myconsole("error", "errormessage");

Мясо myconsole здесь:

args = Array.prototype.slice.apply(arguments, 1);
window.console[method].apply(window.console, args);

В первой строке копируются все аргументы, предоставленные myconsole, кроме первой (это имя метода, который мы хотим использовать). Вторая строка извлекает объект функции для свойства, названного строкой в ​​method из объекта console, а затем вызывает его через функцию JavaScript apply , передавая эти аргументы.

Вариант 2:

Мне пришла вторая альтернатива, которая лучше всего выражена непосредственно в коде:

var myconsole = (function() {

    var methods = "log debug info warn error assert clear dir dirxml trace group groupCollapsed groupEnd time timeEnd profile profileEnd count exception table".split(' '),
        index,
        myconsole = {},
        realconsole = window.console;

    for (index = 0; index < methods.length; ++index) {
        proxy(methods[index]);
    }

    function proxy(method) {
        if (!devmode || !realconsole || typeof realconsole[method] !== 'function') {
            myconsole[method] = noop;
        }
        else {
            myconsole[method] = function() {
                return realconsole[method].apply(realconsole, arguments);
            };
        }
    }

    function noop() {
    }

    return myconsole;
})();

Тогда вы просто звоните log, warn и т. Д. На myconsole как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...