2010-11-09 17 views
2

Mootools étend la classe "Function" et ajoute une nouvelle méthode appelée "extend". Maintenant, jQuery essaie d'ajouter la fonction "extend" en utilisant jQuery.prototype.extend. Cependant, puisque "extend" fait déjà partie de l'objet jQuery (puisque jQuery est un objet de la classe Function), jQuery.prototype.extend ne fonctionne pas. Est-ce que quelqu'un a rencontré ce conflit en utilisant Mootools et jQuery simultanément?Mootools étend la classe "Function" avec une méthode "extend" rendant jQuery inutilisable

Plus génériquement, si une classe native comme "Function ou Array ou Object" est étendue, avons-nous un moyen de revenir aux définitions d'origine?

+0

pourquoi voulez-vous soucier de la chaîne prototype si vous définissez localement - il/ne devrait pas aller à Function.prototype.extend si elle voit jQuery.prototype.extend dans cette portée ... https://github.com/jquery/jquery/blob/master/src/core.js#L313 ils ne semblent pas vérifier la chaîne du prototype pour la fonction –

+0

https: //github.com/jquery/jquery/blob/master/src/core.js#L68 jQuery.fn est en fait défini pour être égal à jQuery.prototype – Sharad

Répondre

2

La seule façon que je peux penser à faire:

<script type="text/javascript"> 
    // copy the original function 
    var ext = Function.prototype.extend; 
    // remove it 
    delete Function.prototype.extend; 
</script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> 

<script type="text/javascript"> 
    // Copy the jQuery version 
    var jqext = jQuery.prototype.extend; 
    // remove it (for sanity). 
    delete jQuery.prototype.extend; 

    // reassign the original function. 
    Function.prototype.extend = ext; 
    // remove the jQuery extend method (now the original Function.extend method) 
    delete jQuery.prototype.extend; 
    // reassign jQuery's original extend method. 
    jQuery.prototype.extend = jqext; 
</script> 
+0

La solution fonctionne bien. Cependant, je n'ai pas compris pourquoi nous faisons une suppression de jQuery.prototype.extend (pour sanity one), puis une fois de plus après avoir réassigné function.prototype.extend. Est-ce que changer le baseclass change aussi les classes déjà héritées? – Sharad

+0

Je l'ai supprimé parce que je n'aimais pas l'idée de devoir compenser ce qui pourrait arriver si Function.prototype.extend = ext; J'ai trouvé qu'attribuer à un nom de variable vide a moins de potentiel pour être débogué. – cwallenpoole

0

Avez-vous essayé jQery.noConflict? http://api.jquery.com/jQuery.noConflict/

+0

Oui, j'ai. noConflict permet d'éviter les conflits avec le "$". Cependant, ici, ce n'est pas sur la dénomination des variables. C'est à propos d'une classe de base étendue. – Sharad