2013-03-05 10 views
6

Abbiamo alcuni Foo oggettoJS - catena di arresto di metodi di oggetti senza errori

var Foo = function() { 

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

Così ci permette di fare un po 'di foo.bar().bar().bar().bar(); catena.

Ma se nel mezzo della catena, la barra() restituisce false, i successivi tentativi della barra() causeranno l'errore che undefined has no method bar() è di solito.

Quindi, come rendere tutte le catene restituite false senza errori, se uno dei suoi "anelli" restituisce falso?

FIDDLE

risposta

3

Sarà necessario cambiare il tipo di ritorno di bar. Suggerisco di creare una sorta di oggetto null a tale scopo e aggiungere un metodo di finalizzazione alla fine della catena, che restituisce false per l'oggetto null:

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

Per esempio, il violino non ho usato il metodo Finalize, ma invece ha dato all'oggetto null un metodo show. Altrimenti si avrebbe comunque false.show() alla fine:

Fiddle

+1

1, è così chiamato 'Null Object pattern' - buon esempio di come usarlo! – mkk

+0

sì, è da lì che ho preso il termine. Riferimento: http://c2.com/cgi/wiki?NullObject –

+0

Ok, ho capito. Ma mi preoccupo se non diventa complicato quando le classi sono più grandi. – OPOPO

0

E 'questo ciò che si vuole: 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

catene metodo può essere un po' pericoloso . Tutto ha a che fare con le dipendenze.

Quando si utilizza il metodo di concatenamento, è una buona idea tenere d'occhio gli oggetti restituiti da ciascuna parte della catena.

Se non sono tutti uguali, ad esempio non sono tutte stringhe, quindi è una buona idea suddividere la catena in istruzioni separate. O forse li estrae in una funzione separata.

Diciamo che avere qualche catena come

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

Le dipendenze implicite per la catena sono Array, Object1, TagWrapper, Tag, String

Ora la funzione che hai scritto è ora accoppiato al tutti questi oggetti e qualsiasi modifica a questi possono potenzialmente devastare il tuo codice.

Dove, come se guardiamo

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

Tutte le offerte con solo l'oggetto String.

Per maggiori informazioni visita Law of Demeter

+0

Non sto cercando un modo javascript o jQuery per farlo, l'ho già fatto. –