console.log || alert

Рабо­тая над про­то­ти­па­ми JavaScript-ядра для веб-при­ло­же­ния с рабо­чим назва­ни­ем «Scratch», пере­о­ди­че­ски при­хо­дит­ся исполь­зо­вать функ­цию console.log() (FireFox-пла­ги­на FireBug) для отлад­ки JS-сце­на­ри­ев. Каза­лось бы всё хоро­шо, но моим люби­мым бра­у­зе­ром уже мно­го лет явля­ет­ся Opera, а пол­но­цен­но­го пла­ги­на FireBug для него, как вы зна­е­те, нет. При этом, исполь­зо­вать аль­тер­на­тив­ные реше­ния типа FireBug-lite и Dragonfly до сей день боль­шо­го жела­ния не воз­ни­ка­ет… А вот жела­ние выво­дить на экран отла­доч­ную инфор­ма­цию, да так, что­бы про­ис­хо­ди­ло это неза­ви­си­мо от того, в каком бра­у­зе­ре запу­ще­но при­ло­же­ние и уста­нов­лен ли пла­гин FireBug – всё же воз­ник­ло, для чего была очень спеш­но напи­са­на сле­ду­ю­щая функция:

(function() {
    var wa = window.alert;
    window.alert = function() {
        if(window.console)console.log(arguments);
        else return wa.apply(this, arguments)
    }
})();

Вер­сия для рабо­ты в связ­ке с HabraAlert:

(function() { 
    var wa = window.alert;
    window.alert = function() { 
        window.console && console.log(arguments);
        if("function" === typeof initHA) {
            var a = Object.apply(this, arguments); 
            a.constructor == Array || a.constructor == Object ? message(print_r(a, "")) : encode_entities(message(a))
        } else return wa.apply(this, arguments) 
    };
    /* optional */
    if("undefined" === typeof initHA) { 
        window.warning = function() {};
        window.error = function() {} 
    }
    /* optional */
})();
 
function encode_entities(s){
  return s.replace(/[<>&"]/g, function(m){
    return {'<':'&lt;', '>':'&gt;', '&':'&amp;', '"':'&quot;'}[m] || m;
  })
}
 
function print_r(o, s) {
  if(o.constructor == Array || o.constructor == Object) {
    s += '<ul style="margin:0;padding-left:20px">';
    for(var i in o)if(o[i].constructor == Array || o[i].constructor == Object) {
      s += "<li>[" + i + "] => " + typeof o + "</li>";
      s = '<ul style="margin:0;padding-left:5px">' + print_r(o[i], s) + "</ul>";
    } else s += "<li>[" + i + "] => " + encode_entities(o[i]) + "</li>";
    s += "</ul>";
    return s
  }
}
 
// usage:
var w = ['hello', 'world!'];
var a = [';)'];
alert(w, a);
warning('my warning');
error('my error');
 
// or:
message('something went wrong', "warning");
message('shit happens', "error", 7500);

Демо

Подо­зре­ваю в буду­щем будет рефак­то­ринг и рас­ши­ре­ние функционала… ;)