Hallo,
Habe in einem Framework eine init-Methode, die so ähnlich wie die von jQuery funktioniert.
Man kann alles als Parameter übergeben: Arrays, HTMLCollections, Strings, Object-Literale etc. Wenn Arrays oder HMTLCollection übergeben werden, sollen diese gleich behandelt werden. (normalerweise wird ein String übergeben als Selektor für HTML-Elemente, darüber hinaus soll die init-Methode aber auch dazu dienen, Array- und HTMLCollection-Elemente abzuspeichern aus chaining-Gründen. Muss also insbesondere diese beiden von z.B. Strings diskriminieren können).
Wahrscheinlich reicht so etwas aus:
if (!arg) return; // Sämtliche falsy values sind wahrscheinlich unbenutzbar
if (typeof arg == 'string') {
// Behandle als Selektor
} else if (typeof arg.length == 'number' && arg[0]) {
for (var i, l = arg.length; i < l; i++) {
// Als Liste behandeln
}
} else {
// Behandle als Object (Hash)
}
Generell sollte man zwei Sachen trennen: Die Funktionsfähigkeit eines Codes bei korrekter Benutzung und die Qualität der Fehlerausgabe bei inkorrekten oder unbrauchbaren Eingabewerten. Natürlich kann man der Funktion z.B. einen Array übergeben, in der keine Elemente drin sind. Es ist deine Entscheidung, in wie weit du noch prüfst, ob das wirklich Elemente sind, und Exceptions wirfst, wenn die Eingabewerte nicht brauchbar sind. Das führt dich aber nur auf auf das nicht-triviale Problem, wie man browserübergreifend Elementobjekte erkennt.
Auch hier würde ich wieder auf Duck Typing setzen, anstatt mit instanceof, constructor, der internen [[Class]]-Eigenschaft oder ähnlich zu arbeiten. Wenn man deinen Erkennungscode betrügen will, dann kann man das vermutlich, daher würde ich mich darauf beschränken, bei offensichtlichen Fehlbenutzung Exceptions zu werfen (throw new Error('…')
).
Siehe auch meinen Artikel Objektabfragen und Fallunterscheidungen in JavaScript.
Mathias