произвольные имена методов в объекте JavaScript - PullRequest
1 голос
/ 15 марта 2012

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

Пока у меня есть

debug = {
        consoleAvailable :  (typeof console == "object"),
        reportToConsole : 0,
        list            : [],
        setReporting    : function(level){
                            this.reportToConsole = level;
                            return true;
                        },
        log             : function(){
                            if (this.reportToConsole>0 && this.consoleAvailable && typeof console.log=="function")  console.log.apply(console, this.log.arguments);
                            this.list.push({'type':'log', 'msg':this.log.arguments});
                            return true;
                        },
};

Это все работает хорошо, но я не хочу перечислять все функции журнала, ошибок, предупреждений и т. Д. Вместо этого я хотел бы иметь возможность просто набрать debug. [Что-то] и функцию, чтобы интерпретировать это [что-то] и выполнить его так же, как у меня работает функция журнала.

Это вообще возможно? Если да, то как мне это сделать?

Вот несколько примеров того, что я хотел бы сделать.

debug.setReporting(1); //yes, I want to print to console

debug.log('foo', 'bar', 'baz'); //arbitrary number of arguments (this is already working)
debug.error('qux'); //function I haven't named, but there is a console.error function
debug.arbitraryName([1, 2, 3]); //no function for console.arbitraryName (ideally it would just console.log the argument(s)

Редактировать

Хорошо, похоже, что метод @Rob W - правильный путь, однако у меня возникли проблемы с его реализацией. Похоже, что я неправильно передаю имя функции или подобное. У меня есть скрипка, показывающая проблему http://jsfiddle.net/xiphiaz/mxF4m/

Заключение

Похоже, что слишком много причуд браузеров, чтобы получить действительно общий отладчик без написания специального кода браузера, поэтому я просто перечислил мои наиболее часто используемые функции журнала (журнал, предупреждение и ошибка). Это дает мне возможность дополнительно настроить результат каждой из этих функций.

результат:

debug = {
    consoleAvailable :  (typeof console == "object"),
    reportToConsole : 0,
    list            : [],
    setReporting    : function(level){
                        this.reportToConsole = level;
                        return true;
                    },
    log             : function(){
                        if (this.reportToConsole>0 && this.consoleAvailable && typeof console.log=="function")  console.log.apply(console, this.log.arguments);
                        this.list.push({type:'log', msg:this.log.arguments});
                        return true;
                    },
    warn            : function(){
                        if (this.reportToConsole>0 && this.consoleAvailable && typeof console.warn=="function") console.warn.apply(console, this.warn.arguments);
                        this.list.push({type:'warn', msg:this.warn.arguments});
                        return true;
                    },
    error           : function(){
                        if (this.reportToConsole>0 && this.consoleAvailable && typeof console.error=="function")    console.error.apply(console, this.error.arguments);
                        this.list.push({type:'error', msg:this.error.arguments});
                        return true;
                    }
};

debug.setReporting(1);

debug.log('foo', 'bar', 'baz');
debug.error('qux');
debug.warn({test:"warning"});
console.log(debug.list);

1 Ответ

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

Вы можете получить массив всех свойств (включая не перечисляемые), используя метод Object.getOwnProprtyNames.Затем перечислите его и проверьте, является ли console[key] функцией.Если да, расширьте свой собственный объект с помощью метода.

Object.getOwnPropertyNames(console)

Что касается вашего последнего вопроса, есть нестандартный __noSuchMethod__ метод, который перехватывает вызовы неопределенных функций.*

Я настоятельно рекомендую использовать мой первый предложенный метод, потому что метод console волшебным образом не увеличится.Это также облегчает отладку.

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