2009-02-27 9 views
18

pensé que esto sería tan fácil como:Cómo determinar si el objeto JavaScript nativo tiene una propiedad/método?

if(typeof(Array.push) == 'undefined'){ 
    //not defined, prototype a version of the push method 
    // Firefox never gets here, but IE/Safari/Chrome/etc. do, even though 
    // the Array object has a push method! 
} 

y funciona bien en Firefox, pero no en IE, Chrome, Safari, Opera, vuelven todas las propiedades/métodos de la nativa Arregle el objeto como 'indefinido' usando esta prueba.

El método .hasOwnProperty (prop) solo funciona en instancias ... por lo que no funciona, pero por prueba y error me di cuenta de que esto funciona.

//this works in Firefox/IE(6,7,8)/Chrome/Safari/Opera 
if(typeof(Array().push) == 'undefined'){ 
    //not defined, prototype a version of the push method 
} 

¿Hay algo malo en usar esta sintaxis para determinar si existe una propiedad/método en un objeto nativo /~ "Clase JavaScript" ~, o hay una mejor manera de hacer esto?

Respuesta

30

En primer lugar, typeof es un operador, no una función, por lo que no necesita los paréntesis. En segundo lugar, acceda al prototipo del objeto.

alert(typeof Array.prototype.push); 
alert(typeof Array.prototype.foo); 

Al ejecutar typeof Array.push que está probando si el propio objeto Array tiene un método de empuje, no se si las instancias de la matriz tienen un método push.

+0

Interesante ... Leí que .prototype era solo para agregar nuevas propiedades/métodos a los objetos, no pensé en usar typeof en él. p.ej. prototipo http://www.devguru.com/technologies/JavaScript/10764.asp typeof http://www.devguru.com/technologies/JavaScript/11529.asp – scunliffe

+0

Es por eso, sí, pero no SOLO por eso . Recomiendo ver la presentación de Douglas Crockford sobre "Javascript avanzado" en el Teatro YUI (http://developer.yahoo.com/yui/theater/). Hay algunas cosas geniales, incluyendo cómo funcionan los prototipos de objetos. –

+1

esto no verá las propiedades definidas en los prototipos principales –

2

And it does work fine in Firefox

¡Eso es solo por coincidencia! En general, no se puede esperar que el método de un prototipo también exista en la función constructora.

if(typeof(Array().push) == 'undefined') 

Esto era casi derecho, sino olvida new, Gotcha JavaScript perenne. new Array().push, o [].push para abreviar, verificaría correctamente que una instancia tuviera el método que deseaba.

51

La forma correcta para comprobar si existe una propiedad:

if ('property' in objectVar) 
+1

Estaba buscando una forma de comprobar si existe 'AddFavorite' en window.external, hasta ahora esto: alerta ('AddFavorite' en window.external) ; es el único script que funciona! gracias – Elmer

+1

Esta debería ser la respuesta aceptada, funciona en todos los casos, a diferencia de la respuesta aceptada actualmente. –

8

El .hasOwnProperty se puede acceder en proptotype de la matriz, si typeof no es suficiente idiomática.

 

if (Array.prototype.hasOwnProperty('push')) { 
    // Native array has push property 
} 
 
+0

buena opción - solo hay que asegurarse de que esto no se prueba en elementos DOM en versiones anteriores de IE sin verificar primero si el objeto tiene el método '.hasOwnProperty()' http://msdn.microsoft.com/en- us/library/328kyd6z% 28VS.85% 29.aspx # CommunityContentHeader – scunliffe

Cuestiones relacionadas