Mootools расширяет класс Function с помощью метода расширения, что делает jQuery непригодным для использования.

Mootools расширяет класс «Function» и добавляет в него новый метод «extend». Теперь jQuery пытается добавить функцию «расширить», используя jQuery.prototype.extend. Однако, поскольку «extend» уже является частью объекта jQuery (поскольку jQuery является объектом класса Function), поэтому jQuery.prototype.extend не работает. Кто-нибудь сталкивался с этим конфликтом при одновременном использовании Mootools и jQuery?

В более общем смысле, если собственный класс, такой как «Функция, массив или объект», расширяется, есть ли у нас способ вернуться к исходным определениям?


person Sharad    schedule 09.11.2010    source источник
comment
зачем вам заботиться о цепочке прототипов, если вы определяете ее локально - она ​​не будет/не должна переходить к Function.prototype.extend, если увидит jQuery.prototype.extend в этой области... github.com/jquery/jquery/blob/master/src/core.js#L313 они, кажется, не проверяют цепочку прототипов на функциональность   -  person Dimitar Christoff    schedule 09.11.2010
comment
github.com/jquery/jquery/blob/master/src/ core.js#L68 jQuery.fn фактически определяется как равный jQuery.prototype   -  person Sharad    schedule 10.11.2010


Ответы (2)


Единственный способ, которым я могу это сделать:

<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>
person cwallenpoole    schedule 09.11.2010
comment
Решение работает нормально. Однако я не понял, почему мы удаляем jQuery.prototype.extend (для здравого смысла), а затем еще раз после повторного присвоения function.prototype.extend. Изменяет ли изменение базового класса уже унаследованные классы? - person Sharad; 09.11.2010
comment
Я удалил его, потому что мне не нравилась идея компенсации за то, что может произойти, если Function.prototype.extend = ext; с ним что-то не так. Я обнаружил, что присваивание пустого имени переменной менее вероятно для отладки. - person cwallenpoole; 09.11.2010

Вы пробовали jQery.noConflict? http://api.jquery.com/jQuery.noConflict/

person Mike Ruhlin    schedule 09.11.2010
comment
Да, у меня есть. noConflict помогает избежать конфликта с $ . Однако здесь речь идет не об именовании переменных. Речь идет о расширенном базовом классе. - person Sharad; 09.11.2010