Ive toujours utilisé littéraux d'objet parce qu'ils sont une façon claire pour organiser le code. C'est pourquoi je n'aime pas les prototypes, c'est trop compliqué.
Les fonctions ne polarisent pas l'espace de nom en tant que personne mentionnée ci-dessus, pas plus que les littéraux d'objet.
Vous pouvez facilement écrire un littéral comme
var obj = {}
var find = function(elem) { /* find code */ },
var doSomething = function() { /* doSomething code */ },
var doSomethingElse = function() { /* doSomethingElse code */ }
qui en créant beaucoup polluer d'objets globaux même les mêmes que les fonctions. De même, vous pouvez faire:
(function() {
function find(elem) { /* find code */ },
function doSomething() { /* doSomething code */ },
function doSomethingElse() { /* doSomethingElse code */ }
})();
qui ne serait pas créer ces objets globaux (tout est un objet JS)
cette façon, vous ne créez pas encore les charges d'objets globaux.
À mon avis, les littéraux d'objets ont deux avantages. Un qu'ils sont utilisés par de nombreux plugins tels que jQuery afin que les gens sont familiers et ils sont faciles à lire. Les rendant faciles à passer à travers les données dans un plugin. Il est facile de créer des méthodes publiques et privées ....
Ils peuvent être lents, car chaque fois que vous créez une instance de l'objet, toutes ses méthodes sont dupliquées. Je crois comprendre que ce n'est pas le cas avec le prototype car vous avez une copie des méthodes et les nouveaux objets réfèrent simplement au prototype.
Je pourrais me tromper bien sûr ...
Lorsque vous instanciez une fonction de manière "anonyme", vous pouvez toujours lui donner un nom (var x = function x() {...}). Lorsque vous faites cela, le nom est lié de telle sorte qu'il est disponible pour les références récursives dans la fonction. – Pointy
@Pointy: Vous ne pouvez pas faire cela (utiliser un nom de fonction dans une affectation) cross-browser, cela ne fonctionne pas correctement sur IE ou Safari; détails: http://yura.thinkweb2.com/named-function-expressions/ Et vous n'avez pas besoin, le nom propre de la fonction (le 'foo' dans' function foo') est dans le champ d'application dans toute la portée où il est déclaré, y compris dans la fonction elle-même, donc 'foo' peut s'appeler via le symbole' foo', pas besoin d'assigner la référence de la fonction à quelque chose (à ce moment-là). –
(suite) Supposons qu'il serait * gentil * de pouvoir utiliser à la fois l'affectation et le nom propre en même temps, car cela faciliterait l'exportation des fonctions de la fonction de portée. La spécification le permet certes, mais malheureusement, les pratiques (bugs de mise en œuvre) y entrent. –