2013-03-05 12 views
6

Mamy jedne Foo obiektJS - łańcuch przystanek metod obiektów bez błędu

var Foo = function() { 

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

co pozwala nam zrobić kilka foo.bar().bar().bar().bar(); łańcuch.

Ale jeśli w środku łańcucha, bar() zwróci wartość false, następne próby baru() spowodują błąd, który stanowi błąd.

Jak sprawić, by wszystkie łańcuchy zwracały fałsz, bez błędów, gdy którekolwiek z jego "pierścieni" zwrócą fałsz?

FIDDLE

Odpowiedz

3

Trzeba będzie zmienić typ zwracanej barze. Proponuję, aby utworzyć rodzaj obiektu null do tego celu i dodać metodę finalizacji na końcu łańcucha, która zwraca wartość false dla zerowej obiektu:

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

Dla skrzypce przykład ja nie stosujemy metodę sfinalizować ale zamiast tego dał obiekt zerowy metodę pokazową. W przeciwnym razie nadal musiałby false.show() na koniec:

Fiddle

+1

+1, to jest tzw 'Null Object Pattern' - dobrym przykładem tego, jak go używać! – mkk

+0

tak, to jest miejsce, z którego otrzymałem ten termin. Odniesienie: http://c2.com/cgi/wiki?NullObject –

+0

Ok Mam to. Ale martwię się, jeśli to nie będzie trudne, gdy zajęcia będą większe. – OPOPO

0

Czy to co chcesz: 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

łańcuchy metoda może być trochę niebezpieczne . Wszystko zależy od zależności.

Podczas korzystania z łańcuchów metod warto zwracać uwagę na obiekty, które zwracają poszczególne części łańcucha.

Jeśli nie wszystkie są takie same, np. Nie wszystkie są łańcuchami, dobrym pomysłem jest podzielenie łańcucha na osobne wyciągi. A może wyodrębnić je do osobnej funkcji.

Powiedzmy, że masz jakiś łańcuch, taki jak

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

Te ukryte zależności dla łańcucha są Array Object1, TagWrapper, Tag, String

Teraz funkcja masz napisane jest teraz połączony z wszystkie te obiekty i wszelkie ich zmiany mogą potencjalnie zniszczyć twój kod.

Gdzie niby patrzymy na

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

Wszystkie oferty tylko z obiektu String.

Więcej informacji można znaleźć Law of Demeter

+0

Nie szukam sposobu javascript lub jQuery, już to mam.Szukam sposobów na to za pomocą animacji css lub translate. –

Powiązane problemy