¿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.

Omar
fuente
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);
}
Sean Vieira
fuente
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 .

artlung
fuente
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
Peter Tseng
fuente
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
}
Matt Ball
fuente
1

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

Ain Tohvri
fuente
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>
Javier Elices
fuente