2013-03-05 10 views
6

Wir haben einige FooJS - Anschlagkette von Objekten Methoden ohne Fehler

var Foo = function() { 

    this.bar = function(bazinga) { 
     if (bazinga) {return this;} 
     else {return false;} 
    } 
    this.show = function() { 
     alert('bar'); 
    } 
}; 

So Objekt, das es erlaubt uns, etwas foo.bar().bar().bar().bar(); Kette zu tun.

Aber wenn in der Mitte der Kette, bar() false zurückgibt, wird der nächste bar() Versuche Fehler verursachen, dass undefined has no method bar() whitch ist ofc Sache.

Also, wie alle Kettenrückgabe falsch ohne Fehler, wenn irgendwelche seiner "Ringe" falsch zurückgeben?

FIDDLE

Antwort

3

Sie den Rückgabetyp der Bar ändern. Ich schlage vor, eine Art Null-Objekt zu diesem Zweck zu schaffen und eine Finalisierung Methode am Ende der Kette hinzufügen, die für die Null-Objekt false zurück:

var Foo = function() { 

    var nullFoo = function() { 
     this.finalize = function() { return false; } 
     this.bar = function() { return this; } 
    } 
    this.finalize = function() { return this; } 
    this.bar = function(bazinga) { 
     if (bazinga) {return this;} 
     else {return new nullFoo();} 
    } 
    this.show = function() { 
     alert('bar'); 
    } 
}; 

foo.bar().bar().bar().bar().finalize(); 

Für Ihre Geige Beispiel ich nicht die Finalisierung Methode verwenden, haben aber Stattdessen gab das Null-Objekt eine show-Methode. Sonst würden Sie noch false.show() am Ende haben:

Fiddle

+1

+1, ist es so genanntes 'Null-Objekt Pattern' - gutes Beispiel dafür, wie es zu benutzen! – mkk

+0

Ja, das ist, wo ich den Begriff habe. Referenz: http://c2.com/cgi/wiki?NullObject –

+0

Ok, ich habe es. Aber ich mache mir Sorgen, wenn es nicht schwierig wird, wenn Klassen größer sind. – OPOPO

0

Ist das, was Sie wollen: http://jsfiddle.net/c24w/MXgzx/5/

JavaScript:

var Foo = function() { 

    var returnValue = true; 

    this.bar = function(bazinga) { 
     returnValue = returnValue && bazinga; 
     return this; 
    } 
    this.show = function() { 
     alert('bar'); 
     return returnValue; 
    } 
}; 
0

Methode Ketten ein bisschen gefährlich sein kann . Es hat alles mit Abhängigkeiten zu tun.

Bei der Kettenverkettung ist es ratsam, die Objekte, die jeder Teil der Kette zurückgibt, im Auge zu behalten.

Wenn sie nicht alle gleich sind, z. B. sind sie nicht alle Zeichenfolgen, dann ist es eine gute Idee, die Kette in separate Anweisungen aufzuteilen. Oder extrahiere sie vielleicht in eine separate Funktion.

Lassen Sie uns sagen Sie einige Kette haben wie

somearray.pop().getATagWrapper().getTag().setSrc("http://www.stackoverflow.com") 

Die impliziten Abhängigkeiten für die Kette sind Array, Object1, TagWrapper, Tag, String

Nun ist die Funktion, die Sie geschrieben haben, ist nun gekoppelt Alle diese Objekte und jede Änderung an diesen können möglicherweise mit Ihrem Code verheerenden Schaden anrichten.

Wo, wie wenn wir uns

someString.trim().substr(12).trim().concat("with awesome") 

Alle Angebote nur mit dem String-Objekt.

Für weitere Informationen siehe Law of Demeter

+0

Ich bin nicht auf der Suche nach einem Javascript oder jQuery Art, es zu tun, ich habe das schon.Ich suche nach Möglichkeiten, dies mit CSS-Animation oder zu übersetzen. –

Verwandte Themen