Можно ли переопределить функцию JavaScript toString (), чтобы обеспечить значимый вывод для отладки? - PullRequest
102 голосов
/ 10 июня 2011

Когда я console.log() объект в моей программе JavaScript, я просто вижу вывод [object Object], который не очень помогает выяснить, какой объект (или даже тип объекта) это.

В C # я привык переопределять ToString(), чтобы иметь возможность настраивать представление отладчика объекта. Есть ли что-нибудь подобное, что я могу сделать в JavaScript?

Ответы [ 14 ]

0 голосов
/ 25 августа 2015
A simple format Date function using Javascript prototype, it can be used for your purpose

https://gist.github.com/cstipkovic/3983879 :

Date.prototype.formatDate = function (format) {
    var date = this,
        day = date.getDate(),
        month = date.getMonth() + 1,
        year = date.getFullYear(),
        hours = date.getHours(),
        minutes = date.getMinutes(),
        seconds = date.getSeconds();

    if (!format) {
        format = "MM/dd/yyyy";
    }

    format = format.replace("MM", month.toString().replace(/^(\d)$/, '0$1'));

    if (format.indexOf("yyyy") > -1) {
        format = format.replace("yyyy", year.toString());
    } else if (format.indexOf("yy") > -1) {
        format = format.replace("yy", year.toString().substr(2, 2));
    }

    format = format.replace("dd", day.toString().replace(/^(\d)$/, '0$1'));

    if (format.indexOf("t") > -1) {
        if (hours > 11) {
            format = format.replace("t", "pm");
        } else {
            format = format.replace("t", "am");
        }
    }

    if (format.indexOf("HH") > -1) {
        format = format.replace("HH", hours.toString().replace(/^(\d)$/, '0$1'));
    }

    if (format.indexOf("hh") > -1) {
        if (hours > 12) {
            hours -= 12;
        }

        if (hours === 0) {
            hours = 12;
        }
        format = format.replace("hh", hours.toString().replace(/^(\d)$/, '0$1'));
    }

    if (format.indexOf("mm") > -1) {
        format = format.replace("mm", minutes.toString().replace(/^(\d)$/, '0$1'));
    }

    if (format.indexOf("ss") > -1) {
        format = format.replace("ss", seconds.toString().replace(/^(\d)$/, '0$1'));
    }

    return format;
};
0 голосов
/ 10 июня 2011

Вместо переопределения toString(), если вы включите библиотеку JavaScript прототипа , вы можете использовать Object.inspect(), чтобы получить гораздо более полезное представление.

Большинство популярных фреймворков включают нечто подобное.

0 голосов
/ 10 июня 2011

Вы можете присвоить любым пользовательским объектам свои собственные методы toString или написать общий, который можно вызывать для объекта, на который вы смотрите -

Function.prototype.named= function(ns){
    var Rx=  /function\s+([^(\s]+)\s*\(/, tem= this.toString().match(Rx) || "";
    if(tem) return tem[1];
    return 'unnamed constructor'
}

function whatsit(what){
    if(what===undefined)return 'undefined';
    if(what=== null) return 'null object';
    if(what== window) return 'Window object';
    if(what.nodeName){
        return 'html '+what.nodeName;
    }
    try{
        if(typeof what== 'object'){
            return what.constructor.named();
        }
    }
    catch(er){
        return 'Error reading Object constructor';
    }
    var w=typeof what;
    return w.charAt(0).toUpperCase()+w.substring(1);
}
0 голосов
/ 10 июня 2011

Журнал консоли Chrome позволяет вам осмотреть объект.

...