2013-03-05 15 views
6

olmadan nesneleri yöntemlerin durdurma zinciri Biz Bu yüzden bize biraz foo.bar().bar().bar().bar(); zinciri yapmanızı sağlar bazı FooJS - hatasız

var Foo = function() { 

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

nesne var.

Ancak zincirin ortasında çubuk() false değerini döndürürse, sonraki çubuk() denemeleri, undefined has no method bar() whitch'in bir şey olduğu konusunda hataya neden olur.

Peki tüm zincir dönüşleri hata olmadan yanlış yapıldığında, herhangi bir 'zil sesi' dönüşü yanlıştır?

FIDDLE

cevap

3

Barda dönüş türünü değiştirmek zorunda kalacaktır. Ben bu amaçla boş nesnenin bir tür oluşturmak ve boş nesne için false döndüren zincirin ucunda bir sonlandırma yöntemi eklemek için önermek: Ben sonuçlandırmak yöntemi kullanmak vermedi sizin keman Örneğin

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

ama bunun yerine boş nesneyi bir gösteri yöntemi verdi. Aksi takdirde yine sonunda false.show() olurdu:

Fiddle

+1

+1 bkz, o kadar denir 'Boş Nesne Pattern' - nasıl kullanılacağını iyi bir örnek! – mkk

+0

evet, buradan terimi aldım. Referans: http://c2.com/cgi/wiki?NullObject –

+0

Tamam anladım. Fakat sınıflar büyüdüğünde zorlaşmazsa endişeleniyorum. – OPOPO

0

istediğini böyle mi: 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

Yöntem zincirleri biraz tehlikeli olabilir . Bağımlılıkların hepsi bu.

Yöntem zincirlemeyi kullanırken, zincirin her parçasının geri döndüğü nesnelere göz atmak iyi bir fikirdir. Hepsi aynı değilse, örneğin tüm dizeler değillerse, zinciri ayrı ifadelere ayırmak iyi bir fikirdir. Ya da belki ayrı bir işleve ayıklar.

bazı zinciri var Diyelim zinciri için gibi

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

örtük bağımlılıkları,

Şimdi yazdım işlevi artık bağlanmıştır dize

Dizi, Object1, TagWrapper, Etiket vardır Tüm bu nesneler ve bunlara yapılan herhangi bir değişiklik, kodunuzla olası hasara yol açabilir.

nereye yalnızca String nesnesi ile

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

Tüm fırsatlar bakmak sanki. Daha fazla bilgi için

Law of Demeter

+0

Bunu yapmak için bir javascript veya jQuery yolu arıyorum, zaten var.Ben css animasyonu veya tercüme kullanarak bunun için yollar arıyorum. –