2009-05-22 8 views
20

que tienen un objeto de JavaScript personalizado que se crea con new, y asignar propiedades a base de argumentos de creación:¿Cuál es la forma correcta de probar la existencia de una propiedad en un objeto de JavaScript?

function MyObject(argument) { 
    if (argument) { 
     this.prop = "foo"; 
    } 
} 
var objWithProp = new MyObject(true); // objWithProp.prop exists 
var objWithoutProp = new MyObject(false); // objWithoutProp.prop does not exist 

Cuál es la forma correcta para la prueba de la existencia de la propiedad prop de los objetos? He visto las siguientes formas utilizadas, pero no estoy seguro de si cualquiera de estas maneras es la mejor manera:

  • if (obj.prop) {}
  • if (obj.hasOwnProperty("prop")) {}
  • if ("prop" in obj) {}

Específicamente, I' m solo está interesado en probar si la propiedad está explícitamente definida para este objeto, no en la cadena de prototipos. Además, el valor nunca se establecerá en null o undefined, pero podría ser algo así como un objeto vacío o una matriz. Sin embargo, si desea incluir la forma correcta de hacerlo, siéntase libre.

Respuesta

29

hasOwnProperty es exactamente lo que está buscando, ya que especifica "si la propiedad está explícitamente definida para este objeto, no en la cadena de prototipos". Por https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty, "Este método se puede utilizar para determinar si un objeto tiene la propiedad especificada como propiedad directa de ese objeto; a diferencia del operador en, este método no verifica la cadena de prototipos del objeto". - parece coincidir exactamente con tu requerimiento!

7

Si está buscando una propiedad definida en un objeto, puede usar el método hasOwnProperty del objeto. de esta manera:

myObject = new MyObject(); 
// some code 
if (myObject.hasOwnProperty('prop')) { 
    // prop exists 
} 

pero esto es sólo saber si este tipo de propiedad se define en sí mismo objeto, pero no sus padres. entonces si tal propiedad es heredada por el objeto, no puedes probar su existencia de esta manera.

la otra manera es probar la propiedad contra el valor indefinido. de esta manera:

if (myObject.prop !== undefined) { 
    // prop exists 
} 

recuerde utilizar el operador == en lugar de = = porque no diferirá entre nulo y sin definir, pero == hace!!!!. entonces si su objeto tiene una propiedad pero el valor es nulo,! = no lo ayudará. entonces esta prueba:

if (myObject.prop) { 
} 

puede tener resultados incorrectos si "prop" tiene un valor falso o nulo. pero comparando con el operador! == sin definir, puede estar seguro de que los valores nulos/falsos no lo confundirán.

2

se puede comprobar la existencia de un variable de la siguiente manera:

if (typeof variable === 'undefined' || variable === null) { 
    // Do stuff 
} 

también se puede utilizar para properties.

Cuestiones relacionadas