J'ai pas regardé attentivement le code, mais ce que je vois, c'est que le premier est plus court et particulièrement simple à lire sans se prendre la tête. Le deuxième est plus long et plus compliqué, tu amènes le prototype dans le jeu alors que tu ne sembles pas en avoir besoin.
Après avoir regardé un peu plus attentivement la 2e version (ce qui n'a pas été nécessaire pour comprendre le 1er code), je vois que ça fait bien la même chose, mais au début j'ai cru voir de loin un singleton (alors que la variable `current` est juste... pas utilisée), qui écraserait la "sélection" précédente à chaque appel de `$().scrollOffset`.
En terme de performance, j'ai pas benchmarké ton code précis, mais j'avais il y a un certain temps comparé un code fonctionnel et un code objet avec prototype (les deux faisaient la même chose, et y'avait des événements). Pour la gestion d'événements en gardant le contexte (sans passer directement par une closure), j'avais été obligé de me faire un helper qui utilise... une closure parce que `Function.prototype.bind` ralentissait clairement l'exécution. Au final la solution la plus rapide a été de faire un gestionnaire d'événements maison qui m'obligeait à passer le `this` à chaque fois que je posais un écouteur d'événements. Je crois que ça égalait quasiment la performance... d'une closure imbriquée.
Bref je pensais à la base que c'était catastrophique d'imbriquer des closures comme ça (parce que "ça créé une nouvelle fonction à chaque appel"), et j'ai essayé d'"aplatir" mon code en utilisant essantiellement de l'objet par prototype, pas une seule fonction imbriquée, et au final, en plus d'avoir du code moins lisible, c'était aussi plus lent.
Après ça je me suis rendu compte que le JS brillait par son côté fonctionnel, et j'ai presque complètement arrêté de toucher au prototype.
Du coup ce que je peux te conseiller pour améliorer ton _premier_ code, c'est... déjà d'indenter avec 2 espaces
, et si tu veux pas imbriquer trop de fonctions, tu peux donner un nom à la fonction que tu passes à `this.each`, et la remonter tout en haut de ta closure principale (mais ça segmente le code et comme le plugin est encore relativement léger, tu perdras surtout en lisibilité).
Ah et aussi, mettre _toujours_ un espace après le mot clé `function` (donc une fonction anonyme, y'a l'espace, puis... rien, donc la parenthèse ouvrante), mais là c'est le maniaque qui parle. 