2010-11-28 18 views
8

Escribo un plugin de jQuery, y me preguntaba cómo asegurarme de que nunca sobreescribo un futuro método nativo de jQuery.¿Cuál es la mejor manera de asegurarse de que un complemento jQuery nunca sobrescriba un método nativo de jQuery?

Por ejemplo, mi complemento se llama Foo y el uso es $('selector').foo().

jQuery 2.6 ha notado la popularidad de Foo y ha decidido incluirlo en el paquete básico. También se usa a través del $('selector').foo().

No quiero que mi Foo sobrescriba el Foo nativo de jQuery (o de lo contrario choque).

Esto es lo que me ocurrió ...

(function($) { 

    // If jQuery adds this method, we don't want to overwrite it 
    if (typeof $.foo === 'function') { 
    return; 
    }; 

    $.fn.foo = function() { 
    // Foo 
    }; 

})(jQuery); 

¿Sería ésta la mejor manera de hacerlo?

+0

Si su aplicación de foo es differen't que con errores, entonces su complemento obtendría de jQuery ... Esta podría ser una buena práctica, sin embargo , tal vez lo intente :-) –

Respuesta

8

Puede omitir las declaraciones if y generar una verificación de definición en la declaración de su función.

(function($){ 

    $.fn.foo = $.fn.foo || function() { 
    // only used if $.fn.foo is undefined 
    } 

})(jQuery) 
+0

¡Eso es sexy! Muchas gracias por tu respuesta. No creo que nadie pueda superar eso. Siempre me olvido de explotar la evaluación de cortocircuito y de que JavaScript devuelva el primer operando * truthy *. – alex

+0

@alxed - Debe tener en cuenta que esto no es seguro para las propiedades, por ejemplo '.length',' .active' y otras cosas que por defecto son '0' que se anularán aquí, incluso cuando jQuery lo utilice. –

+0

@Nick solo hay tres propiedades sin función en el prototipo de jQuery: 'jquery',' length' y 'selector'. Mientras no menciones ninguno de esos tres, deberías estar bien. –

0

Probablemente desee hacer esto de forma similar a la programación de JavaScript normal de una función getElementsByClassName - compruebe si existe y créela si no.

2

creo que sería mejor con:

if ($.foo !== undefined) { 
    alert('there is something at foo'); 
    return; 
    }; 

La razón de ser, su plugin podría tener este aspecto:

$.foo = { 
    doSomething: function() { /* do something*/ }, 
    doSomethingElse: function() { /* do something else*/ } 
    }; 

El typeof lo anterior es no función, pero objeto , por lo que la condición en su ejemplo no se comportará como espera.

+0

Gracias por su respuesta karim79. Tal vez estoy haciendo algo mal, pero cuando hago 'alert ($. Unwrap);' obtengo 'undefined' aunque estoy usando jQuery 1.4 y' alert ($); 'me da' toString() 'de la función jQuery minificada – alex

+0

@alex - lo que quiero decir es esto: http://jsfiddle.net/karim79/qgDSN/1/ si ayuda. – karim79

0

Una versión ligeramente mejor (en cuanto al rendimiento):

jQuery.fn.foo || (jQuery.fn.foo = function(){ 
var $ = jQuery; 
(your code goes here) 
}); 
Cuestiones relacionadas