Ambos están logrando lo mismo, para crear un objeto en el espacio de nombre global en el momento en que se ejecuta el código.
Uno no está más "codificado" que el otro, ya que ninguno está haciendo ningún tipo de prototipado de funciones en el que pueda crear clones del objeto con la nueva palabra clave. Es solo una cuestión de preferencia, en mi opinión.
Por ejemplo, jQuery hace algo parecido a éste:
(function(window, undefined) {
// Use the correct document accordingly with window argument (sandbox)
var document = window.document;
var jQuery = (function() {
// Define a local copy of jQuery
var jQuery = function(selector, context) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init(selector, context, rootjQuery);
},
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,
...
Pero Prototype JS Biblioteca hace lo primero:
var Prototype = {
Version: '1.6.1',
Browser: (function(){
var ua = navigator.userAgent;
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
return {
IE: !!window.attachEvent && !isOpera,
Opera: isOpera,
WebKit: ua.indexOf('AppleWebKit/') > -1,
Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
MobileSafari: /Apple.*Mobile.*Safari/.test(ua)
}
})(),
...
No sé de ninguna razón por la que uno es mejor que el otro, o que cumplen su tarea de manera diferente (para crear el objeto de la aplicación en el espacio de nombres de la ventana).
Preferiría personalmente el primero ya que no tiene un objeto "codificado" – mplungjan