2010-10-31 10 views
1

Est-ce que les frameworks JavaScript qui imite namespaces comme jQuery rend une détection de collision d'espace de nom? Si non, devrais-je le gérer moi-même?Détection de collision "Namespace" en JavaScript?

Si oui ce qui empêche ce cadre pour détecter ces collisions eux-mêmes?

+0

Je n'ai pas le temps d'expliquer moi-même, mais un coup d'oeil à la vidéo de Paul Irish [10 choses à savoir de la source jQuery] (http://www.youtube.com/watch?v=i_qE1iAmjFg # t = 12m35) où il parle de 'noConflict'. Voir aussi son [blog] (http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/) pour d'autres liens et commentaires. –

+0

Merci beaucoup c'est ce que je cherchais. – user310291

Répondre

5

JavaScript namespaces sont normalement imités en utilisant des objets et des fermetures, et souvent initialisés avec une fonction d'auto-invocation:

var myNamespace = (function() { 
    var _name = 'Bob'; 

    return { 
     somePublicMethod: function() { 
     return 'Hello, ' + _name; 
     } 
    }; 
})(); 

alert(myNamespace.somePublicMethod()); 

Malheureusement, si vous redéfinissez la variable d'espace de noms, il n'y a pas d'avertissement pour cela. Qu'est-ce que vous pourriez vraiment faire est de vérifier si la variable d'espace de noms a déjà été défini, et jeter une exception ou soulever une erreur si elle était:

if (typeof myNamespace !== 'undefined') { 
    var myNamespace = (function() { 
     // ... 
    })(); 
} 
else { 
    throw new Error("Whoops! myNamespace already exists."); 
} 
+0

'! ========'? :) – galambalazs

+0

@galambalazs: lol :) :) –

+0

fixe est-ce pas en fait en arrière? Ne vérifieriez-vous pas l'espace de noms === 'undefined' et le définiriez-vous, sinon lancer une erreur? – kakridge

1

Tenir compte venir avec une norme de développement où s'engage toute l'équipe sur la façon dont vous appellera vos espaces de noms. J'ai aussi trouvé utile de revoir les changements apportés à la structure des données ou aux espaces de noms avant de les implémenter.

+0

Mais cela n'est pas possible si votre framework est distribué dans le monde entier comme jquery. – user310291