Ive siempre se utiliza literales de objetos, ya que son una manera clara para organizar código. Por eso no me gusta el prototipo, es demasiado complicado.
Las funciones no contaminan el espacio de nombres como alguien mencionado anteriormente más que los literales de objeto.
Desde aquí se puede escribir como un literal
var obj = {}
var find = function(elem) { /* find code */ },
var doSomething = function() { /* doSomething code */ },
var doSomethingElse = function() { /* doSomethingElse code */ }
que contaminan mediante la creación de una gran cantidad de objetos globales del mismo al igual que las funciones. Del mismo modo que podría hacer:
(function() {
function find(elem) { /* find code */ },
function doSomething() { /* doSomething code */ },
function doSomethingElse() { /* doSomethingElse code */ }
})();
que no crearía esos objetos globales (todo es un objeto de JS)
de esa manera usted todavía no se crea un montón de objetos globales.
En mi opinión, los literales de objetos tienen dos ventajas. Uno es utilizado por muchos complementos como jQuery para que las personas sean más familiares y fáciles de leer. Facilitar el paso de datos a un complemento. Es fácil crear métodos públicos y privados ...
Pueden ser lentos, ya que cada vez que crea una instancia del objeto, todos sus métodos están duplicados. Tengo entendido que ese no es el caso con el prototipo ya que tiene una copia de los métodos y los nuevos proyectos simplemente hacen referencia al prototipo.
Podría estar equivocado, por supuesto ...
Cuando crea una instancia de la forma "anónima", aún puede darle un nombre (var x = function x() {...}). Cuando haces eso, el nombre está vinculado de modo que esté disponible para referencias recursivas dentro de la función. – Pointy
@Pointy: no se puede hacer eso (usar un nombre de función dentro de una tarea) entre navegadores, no funciona correctamente en IE o Safari; detalles: http://yura.thinkweb2.com/named-function-expressions/ Y no es necesario, el nombre propio de la función (el 'foo' en' función foo') está dentro del alcance en todo el alcance donde se declara, incluso dentro de la función misma, para que 'foo' pueda llamarse a sí mismo a través del símbolo' foo', sin necesidad de asignar la referencia de función a nada (en ese punto). –
(Continuación) De acuerdo, sería * agradable * poder usar la asignación y el nombre propio al mismo tiempo, ya que facilitaría la exportación de funciones desde la función de alcance. La especificación ciertamente lo permite, pero lamentablemente, los aspectos prácticos (errores de implementación) entran en él. –