Wie überprüfe ich, ob ein anonymes Objekt eine Methode hat?

145

Wie kann ich überprüfen, ob ein anonymes Objekt als solches erstellt wurde:

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

hat in der Tat eine prop2 definiert?

prop2 wird immer als Funktion definiert, aber für einige Objekte ist es nicht erforderlich und wird nicht definiert.

Ich habe versucht, was hier vorgeschlagen wurde: Wie kann ich feststellen, ob das native JavaScript-Objekt eine Eigenschaft / Methode hat? aber ich denke nicht, dass es für anonyme Objekte funktioniert.

Omar
quelle
6
Es gibt keinen großen Unterschied zwischen anonymen und nicht anonymen Objekten in JavaScript. Sie sind die gleichen unter der Decke.
Vava

Antworten:

278

typeof myObj.prop2 === 'function'; wird Sie wissen lassen, ob die Funktion definiert ist.

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
quelle
1
Versuchen Sie dies, wenn Sie mit dynamischen Variablen überprüfen möchtenif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek
42

Sie wollen 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
	

Referenzen: Mozilla , Microsoft , phrogz.net .

artlung
quelle
4
Dies funktioniert nicht, wenn Sie einen Dom-Knoten in einem selbst erstellten Objekt platziert haben, z. B. wenn var my_obj = {'node1': document.createElement('div')};dann my_obj.node1.hasOwnProperty('cloneNode')false ist. Seans Lösung wird jedoch korrekt true zurückgeben:typeof my_obj.node1.cloneNode === 'function'
Mulllhausen
6
Funktioniert nicht, wenn Sie nach einer Methode suchen, die im Prototyp definiert wurde.
Wilt
2
@Wilt Frage angegeben anonymes Objektliteral.
Artlung
4
@artlung Ja, Ihre Antwort ist gut für die Frage. Ich wollte diesen Kommentar nur hier für andere hinterlassen, die nach einer ähnlichen Lösung suchen, die in anderen Fällen funktioniert (wie ich). Ich wollte Ihre Antwort nicht disqualifizieren.
Wilt
2
Behandelt nicht den Fall, in dem die Eigenschaft definiert ist, ist aber keine Funktion.
Matt2000
15

3 Optionen

  1. typeof myObj.prop2 === 'function' wenn der Eigenschaftsname nicht dynamisch / generiert ist
  2. myObj.hasOwnProperty('prop2') Wenn der Eigenschaftsname dynamisch ist, überprüfen Sie nur, ob es sich um eine direkte Eigenschaft handelt (nicht in der Prototypenkette).
  3. 'prop2' in myObj Wenn der Eigenschaftsname dynamisch ist, überprüfen Sie die Prototypenkette
Peter Tseng
quelle
8

Was meinst du mit einem "anonymen Objekt"? myObjist nicht anonym, da Sie einer Variablen ein Objektliteral zugewiesen haben. Sie können dies einfach testen:

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

Ein Weg, es zu tun, muss sein if (typeof myObj.prop1 != "undefined") {...}

Ain Tohvri
quelle
0

Ich weiß, dass dies eine alte Frage ist, aber ich bin überrascht, dass alle Antworten sicherstellen, dass die Methode existiert und eine Funktion ist, wenn das OP nur die Existenz überprüfen möchte. Um zu wissen, dass es sich um eine Funktion handelt (wie viele angegeben haben), können Sie Folgendes verwenden:

typeof myObj.prop2 === 'function'

Sie können aber auch als Bedingung verwenden:

typeof myObj.prop2

Oder auch:

myObj.prop2

Dies liegt daran, dass eine Funktion nach trueund nach undefinedbewertet false. Wenn Sie also wissen, dass das Mitglied möglicherweise nur eine Funktion ist, können Sie Folgendes verwenden:

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

Oder in einem Ausdruck:

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