¿Cómo verificar si el objeto anónimo tiene un método?


145

¿Cómo puedo verificar si un objeto anónimo que se creó como tal?

var myObj = { 
    prop1: 'no',
    prop2: function () { return false; }
}

¿De hecho tiene un prop2 definido?

prop2 siempre se definirá como una función, pero para algunos objetos no es obligatorio y no se definirá.

Intenté lo que se sugirió aquí: ¿Cómo determinar si el objeto JavaScript nativo tiene una propiedad / método? pero no creo que funcione para objetos anónimos.


66
No hay mucha diferencia entre los objetos anónimos y no anónimos en JavaScript. Son iguales debajo de la cubierta.
vava

Respuestas:


279

typeof myObj.prop2 === 'function'; le informará si la función está definida.

if(typeof myObj.prop2 === 'function') {
    alert("It's a function");
} else if (typeof myObj.prop2 === 'undefined') {
    alert("It's undefined");
} else {
    alert("It's neither undefined nor a function. It's a " + typeof myObj.prop2);
}

1
intente esto si desea verificar con la variable dinámicaif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek

42

Tu quieres hasOwnProperty():

var myObj1 = { 
	prop1: 'no',
	prop2: function () { return false; }
}
var myObj2 = { 
	prop1: 'no'
}

console.log(myObj1.hasOwnProperty('prop2')); // returns true
console.log(myObj2.hasOwnProperty('prop2')); // returns false
	

Referencias: Mozilla , Microsoft , phrogz.net .


44
esto no funcionará si se ha colocado un nodo DOM dentro de un objeto hecho a sí mismo, por ejemplo, si var my_obj = {'node1': document.createElement('div')};a continuación, my_obj.node1.hasOwnProperty('cloneNode')es falso. Sin embargo solución de Sean devolverá correctamente verdadera:typeof my_obj.node1.cloneNode === 'function'
mulllhausen

66
No funcionará si está buscando un método que se definió en el prototipo.
marchita el

2
La pregunta @Wilt especificó un objeto anónimo literal.
artlung

44
@artlung Sí, su respuesta es buena para la pregunta, solo quería dejar ese comentario aquí para otros que podrían estar buscando una solución similar que funcione en otros casos (como yo) ... No quise descalificar su respuesta.
marchita el

2
No maneja el caso donde la propiedad está definida, pero no es una función.
matt2000

15

3 opciones

  1. typeof myObj.prop2 === 'function' si el nombre de la propiedad no es dinámico / generado
  2. myObj.hasOwnProperty('prop2') si el nombre de la propiedad es dinámico, y solo verifique si es propiedad directa (no en la cadena del prototipo)
  3. 'prop2' in myObj si el nombre de la propiedad es dinámico, y verifique la cadena del prototipo

8

¿Qué quiere decir con un "objeto anónimo"? myObjno es anónimo ya que ha asignado un objeto literal a una variable. Puedes probar esto:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}

1

Una forma de hacerlo debe ser if (typeof myObj.prop1 != "undefined") {...}


0

Sé que esta es una pregunta antigua, pero me sorprende que todas las respuestas garanticen que el método existe y que es una función, cuando el OP solo quiere verificar la existencia. Para saber que es una función (como muchos han dicho) puede usar:

typeof myObj.prop2 === 'function'

Pero también puede usar como condición:

typeof myObj.prop2

O incluso:

myObj.prop2

Esto es así porque una función evalúa truey undefinedevalúa a false. Entonces, si sabe que si el miembro existe, puede ser solo una función, puede usar:

if(myObj.prop2) {
  <we have prop2>
}

O en una expresión:

myObj.prop2 ? <exists computation> : <no prop2 computation>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.