Come verificare se l'oggetto anonimo ha un metodo?


145

Come posso verificare se un oggetto anonimo è stato creato come tale:

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

ha davvero un prop2 definito?

prop2 sarà sempre definita come una funzione, ma per alcuni oggetti non è richiesta e non verrà definita.

Ho provato ciò che è stato suggerito qui: Come determinare se l'oggetto JavaScript nativo ha una proprietà / metodo? ma non penso che funzioni per oggetti anonimi.


6
Non c'è molta differenza tra oggetti anonimi e non anonimi in JavaScript. Sono gli stessi sotto la copertina.
vava,

Risposte:


278

typeof myObj.prop2 === 'function'; ti farà sapere se la funzione è definita.

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
prova questo se vuoi controllare con la variabile dinamicaif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek,

42

Tu vuoi 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
	

Riferimenti: Mozilla , Microsoft , phrogz.net .


4
questo non funzionerà se si è posto un nodo DOM all'interno di un oggetto fatto da sé, ad esempio, se var my_obj = {'node1': document.createElement('div')};quindi my_obj.node1.hasOwnProperty('cloneNode')è falso. tuttavia la soluzione di Sean tornerà correttamente vera:typeof my_obj.node1.cloneNode === 'function'
mulllhausen,

6
Non funzionerà se stai cercando un metodo definito nel prototipo.
Appassisci il

2
@Wilt question ha specificato l'oggetto anonimo letterale.
artlung,

4
@artlung Sì, la tua risposta è buona per la domanda, volevo solo lasciare quel commento qui per altri che potrebbero cercare una soluzione simile lavorando in altri casi (come me) ... Non intendevo squalificare la tua risposta.
Appassisci il

2
Non gestisce il caso in cui la proprietà è definita, ma non è una funzione.
matt2000,

15

3 opzioni

  1. typeof myObj.prop2 === 'function' se il nome della proprietà non è dinamico / generato
  2. myObj.hasOwnProperty('prop2') se il nome della proprietà è dinamico e controlla solo se si tratta di proprietà diretta (non nella catena del prototipo)
  3. 'prop2' in myObj se il nome della proprietà è dinamico e controlla la catena del prototipo

8

Cosa intendi con "oggetto anonimo"? myObjnon è anonimo poiché hai assegnato un oggetto letterale a una variabile. Puoi semplicemente provare questo:

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

1

Un modo per farlo deve essere if (typeof myObj.prop1 != "undefined") {...}


0

So che questa è una vecchia domanda, ma sono sorpreso che tutte le risposte assicurino che il metodo esista ed è una funzione, quando l'OP vuole solo verificare l'esistenza. Per sapere che è una funzione (come molti hanno affermato) puoi usare:

typeof myObj.prop2 === 'function'

Ma puoi anche usare come condizione:

typeof myObj.prop2

O anche:

myObj.prop2

Questo perché una funzione valuta truee undefinedvaluta false. Quindi, se sai che se il membro esiste potrebbe essere solo una funzione, puoi usare:

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

O in un'espressione:

myObj.prop2 ? <exists computation> : <no prop2 computation>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.