2016-05-23 4 views
0

Ich Aktualisierung ein Skript, das Parameter wie folgt überprüft:einen Prototyp auf möglicherweise leere Parameter in JS mit

if (config.param) {//do...}

Dies hat zu einigen Problemen in Truthiness führen. Ich hatte eine truthy() Funktion als Prototyp implementiert, um in der Lage sein, Folgendes zu tun:

if (config.param.truthy()) {//do...}

Das schien gut, bis ich nur, dass das Config-Objekt erinnert enthält params explizit festgelegt werden. Daher ist config.value normalerweise undefiniert im Gegensatz zu false.

Ich hatte den Prototyp in einem geeigneten Umfang über String/Number/Boolean.prototype.truthy hinzugefügt. Ist es möglich, den Prototyp auf dem Config-Objekt so zu implementieren, dass es bei nicht definierten Parametern false zurückgeben kann?

Edit: Meine Frage ist nicht über die Wahrhaftigkeit (ich kann einfach eine Funktion verwenden), sondern stattdessen, wie ein Prototyp auf ein Objekt zu implementieren, so dass es von seinen Eigenschaften geerbt wird, die verschiedene Arten oder nicht existent sein können .

+1

"* Ich hatte eine truthy() - Funktion als Prototyp implementiert *" - das war eine wirklich schlechte Idee. Sie sollten es als statische Funktion implementieren, an die Sie den Wert als Argument übergeben. Und Sie sollten es wirklich nicht "truthy" nennen, da dies das JS-Wahrheitskonzept impliziert. Welchen Wert möchtest du wirklich akzeptieren? – Bergi

+1

Was genau ist das Problem, das Sie versuchen zu lösen? Wie sind insbesondere diese "Fragen in Wahrheit"? – Pointy

+0

Verwenden Sie die Objekterkennung, um sicherzustellen, dass die gewünschten Eigenschaften mit 'in' oder' hasOwnProperty' oder 'typeof' oder' x.y == null' für Werte definiert werden, die falsch sein können. – dandavis

Antwort

-1

Unter der Annahme, dass Ihre Parameter alle verschiedene Arten von Daten sein werden, könnte Ihr Ansatz des Hinzufügens von Prototyp-Methoden für Strings/Booleans/etc gut funktionieren. Dann sehen, können Sie einfach, wenn diese Eigenschaft vorhanden ist, indem Sie

if (config.hasOwnProperty("param") && config.param.truthy()) {//do...} 

oder wenn Sie mit dynamischen Eigenschaftsnamen

if(config.hasOwnProperty(param) && config[param].truthy()) {//do...} 
+0

Dies wirft Fälle wie 'config = {param: null}'. Außerdem müßten Sie die Zeichenfolge '" param "' nicht die Variable 'param' an' hasOwnProperty' übergeben. – Bergi

+0

Das ist nicht wahr, 'var obj = {foo: null}; obj.hasOwnProperty ("foo"); 'wird' true' ausgeben. Sie haben die Zeichenfolge richtig eingegeben, ich nahm an, dass es sich um einen dynamischen Eigenschaftsnamen handelt. Ich habe bearbeitet, um beide Fälle abzudecken. –

+0

Das Ziel ist auch, die konditionelle Prägnanz zu behalten, mehrere Fälle zu vermeiden, um zu prüfen. Ich habe 'if (config.param! == false && config.param! ==" false "&& config.param! == 0) verwendet, um ein paar Fälle zu erfassen, in denen Benutzereingaben stark variieren, aber ich hoffe, sie zu behalten cleaner – gabe462

0

if ("param" in config && !!config.param) {//...

Oder wenn Sie wollen, wenn nicht definiert einen Standardwert verwenden, dann

config.param = config.param || defaultValue

Das ganze Problem mit dem Prototyping ist in diesem Fall, dass falsche Werte nicht auf objects autoboxiert werden und der Versuch, Methoden von ihnen aufzurufen, führt zu einem Fehler.

Verwandte Themen