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.


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);
}

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 .


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

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
}

1

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


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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.