Como verificar se o objeto anônimo possui um método?

145

Como posso verificar se um objeto anônimo que foi criado como tal:

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

de fato tem um prop2 definido?

prop2 sempre será definido como uma função, mas para alguns objetos não é necessário e não será definido.

Tentei o que foi sugerido aqui: Como determinar se o objeto JavaScript nativo tem uma propriedade / método? mas não acho que funcione para objetos anônimos.

Omar
fonte
6
Não há muita diferença entre objetos anônimos e não anônimos no JavaScript. Eles são os mesmos debaixo da capa.
vava

Respostas:

278

typeof myObj.prop2 === 'function'; informará se a função 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
fonte
1
tente isso se você quiser verificar com variável dinâmicaif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek
42

Você quer 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
	

Referências: Mozilla , Microsoft , phrogz.net .

artlung
fonte
4
isso não vai funcionar se você colocou um nó dom dentro de um objeto self-made, por exemplo, se var my_obj = {'node1': document.createElement('div')};, em seguida, my_obj.node1.hasOwnProperty('cloneNode')é falsa. no entanto, a solução de Sean retornará corretamente verdadeira:typeof my_obj.node1.cloneNode === 'function'
mulllhausen 24/02
6
Não funcionará se você estiver procurando por um método que foi definido no protótipo.
Wilt
2
A pergunta @Wilt especificou o objeto anônimo literal.
Artlung
4
@artlung Sim, sua resposta é boa para a pergunta, só quero deixar esse comentário aqui para outras pessoas que possam estar procurando uma solução semelhante funcionando em outros casos (como eu) ... Não foi sua intenção desqualificar sua resposta.
Wilt
2
Não lida com o caso em que a propriedade está definida, mas não é uma função.
matt2000
15

3 Opções

  1. typeof myObj.prop2 === 'function' se o nome da propriedade não for dinâmico / gerado
  2. myObj.hasOwnProperty('prop2') se o nome da propriedade for dinâmico e verificar apenas se é propriedade direta (não na cadeia de protótipos)
  3. 'prop2' in myObj se o nome da propriedade for dinâmico e verifique a cadeia de protótipos
Peter Tseng
fonte
8

O que você quer dizer com "objeto anônimo"? myObjnão é anônimo, pois você atribuiu um literal de objeto a uma variável. Você pode apenas testar isso:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}
Matt Ball
fonte
1

Uma maneira de fazer isso deve ser if (typeof myObj.prop1 != "undefined") {...}

Ain Tohvri
fonte
0

Eu sei que isto é uma questão antiga, mas estou surpreso que todas as respostas garantir que existe o método e é uma função, quando o OP só querer verificar para a existência. Para saber que é uma função (como muitos declararam), você pode usar:

typeof myObj.prop2 === 'function'

Mas você também pode usar como uma condição:

typeof myObj.prop2

Ou até:

myObj.prop2

Isso ocorre porque uma função é avaliada truee undefinedavaliada como false. Portanto, se você souber que, se o membro existir, isso poderá ser apenas uma função, você poderá usar:

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

Ou em uma expressão:

myObj.prop2 ? <exists computation> : <no prop2 computation>
Javier Elices
fonte