Soru JavaScript “Proxy Deseni” nedir?


JQuery.com'da bugün 'Proxy Pattern' kavramıyla karşılaştım, ancak hiçbir şey yapamadık. Görünüşe göre, bu harika bir kullanım, ama fikri hiç anlamadım, bana yabancı geliyor. Birisi bana basit terimlerle "3 yaşındaymışım gibi" açıklayabilir mi?


33
2017-09-11 16:47


Menşei


lmgtfy: mark.biek.org/blog/2010/04/the-proxy-pattern-in-javascript. Belki bu yardımcı olur? - home
@home: Bu yazıyı zaten okudum ama yine de fikri anlamadım. - Andrei Oniga
Yakınına oy verdim çünkü @yoda'nın işaret ettiği gibi başka bir soru daha var. - home
@home: Bir gönderiyi ilk önce iyice okumak isteyebilirsiniz. İşte Reigel bu yazıyı şöyle yazdı: "Hangi durumda bu en iyi kullanım olduğunu merak ediyordum". Aynı şeyi sorduğumu nasıl anlıyorsunuz? Bu sadece benim hayal gücüm mü, yoksa "bu nedir?" Diye sordum mu? yerine? Bu "düşüncenin" nasıl daha iyi / daha iyi bir kullanıma nasıl getirileceği ile ilgilenmiyorum, fakat kavramın kendisini anlamak ister. Ayrıntıyı düşünün! - Andrei Oniga
Tamamen söylemeliyim başarısız Aynı soru "proxy" nin kullanılmasından başka, bu soruyla yukarıda bahsedilen bağlantı arasındaki bağlantıyı görmek için. Yukarıdaki gönderi, yürütme işlevine yeni bir bağlam bağlama hakkında konuşuyor. Hangi çağrılarak yapılır proxy() jQuery'de yöntem. Proxy Pattern, hafifçe ilişkili olabilir ve proxy() yöntem, tamamen farklı bir şeydir. Buna ek olarak, hiçbir yerde OP, fikrini nereden aldığını söylemekten başka bir jQuery çözümü ile ilgilendiğini söylemedi. Artık jQuery etiketli bile değil. - ZenMaster


Cevaplar:


Birçok ajax isteğiyle sitenizin olduğunu düşünün. Tasarımda bir değişiklik var. Şimdi her istek önce bazı özel yükleme gif görüntülemek istiyorum. Ajax isteğinin bulunduğu tüm kodları değiştirmeyi düşündünüz veya proxy desenini kullanabilirsiniz.

var proxied = jQuery.ajax; // Preserving original function
jQuery.ajax = function() { 
    jQuery("#loading").dialog({modal: true});
    return proxied.apply(this, arguments);
}

38
2017-09-11 17:38



... ya da sadece ekleyebilirsiniz ajaxStart işleyicisi ... - icktoofay
JQuery'yi veya herhangi bir başka çerçeveyi asla kullanmıyorum. Her zaman çerçeve kodunu tamamlayan bir adaptör vardır, bu yüzden bu tür değişikliklerle başa çıkabilirim. Yukarıdaki kodun amacı, proxy modelinin örnek kullanımını vermekti - Ivan
"Proxy modelini" göstermeye çalıştığınızı anlıyorum, ancak bunun kötü bir örnek olabileceğini söylüyordum, çünkü kütüphanenin hali hazırda örneğinizde sahip olduğunuz şeyi başarmanın daha iyi bir yolu var. - icktoofay


Javascript Desterns kitabında, Stoyan Stefanov bu deseni şöyle tanımlar:

Proxy deseninde, bir nesne başka bir nesneye bir arabirim olarak davranır. Vekil bir nesnenin müşterisi ile nesnenin kendisi arasında oturur ve bu nesneye erişimi korur.

Bu örüntü, bir ek yük gibi görünebilir, ancak performans amacına yönelik olarak yararlıdır. Vekil sunucular, nesne için ("gerçek konu" olarak da bilinir) bir koruyucu rol oynar ve bu nesneyi olabildiğince az iş yapmaya çalışır.

Gerçek bir dünya örneği

Proxy modeli, gerçek konu pahalı bir şey yaptığında faydalıdır. Web'de Yapabileceğiniz en pahalı işlemlerden biri olan uygulamalar ağ talebi HTTP isteklerini olabildiğince birleştirmek mantıklıdır.

Burada bir örnek görebilirsiniz: http://www.jspatterns.com/book/7/proxy.html. (kaynak koduna bakınız).

Sayfadaki videoların bir listesi var. Kullanıcı bir video başlığını tıkladığında, alan başlığın altında video hakkında daha fazla bilgi göstermek için genişler ve aynı zamanda oynanacak video. Detaylı video bilgisi ve videonun URL’si sayfanın bir kısmı; Bir web servis çağrısı yaparak alınmaları gerekiyor. Web hizmeti Birden fazla video kimliğini kabul edebilir, böylece uygulamayı daha az yaparak hızlandırabiliriz HTTP istekleri mümkün olduğunda ve birkaç video için tek seferde veri alıyor.

videolar nesne aramıyor HTTP servis doğrudan ama çağırır vekil yerine. Vekil sonra talebi iletmeden önce bekler. Videolardan yapılan diğer çağrılar 50 ms bekleme süresinde gelirse, bunlar bir araya getirilir. 50 ms'lik bir gecikme, kullanıcı için oldukça belirgindir, ancak istekleri birleştirmeye ve “geçiş” i tıklayıp bir kerede birden fazla videoyu genişletirken deneyimi hızlandırmaya yardımcı olabilir. Web sunucusunun daha az sayıda istekle ilgilenmesi gerektiğinden, sunucu yükünü de önemli ölçüde azaltır.

Proxy olmadan

Without proxy

vekil

With Proxy

Önbellek olarak proxy

As a cache


23
2017-12-21 07:53



Videolar için bağlantılar artık çalışmıyor. Ben kitaptan geçtim - kittu


Genel olarak - Proxy Pattern bir kaynağa erişimi kontrol etmeye gelir. Bunu yaparak çeşitli potansiyel sorunları çözebilir:

  1. Kaynakların yanlış veya kötü niyetli kullanımını önlemek
  2. yaratılması çok pahalı olan bir kaynağa erişimi engelleme / kontrol etme

jQuery terimi oldukça gevşek bir şekilde kullanır, ancak onların fikri, mevcut yöntemi geçersiz kılmanız / gizlemeniz (örneklerinde) jQuery.fn.setArray) daha fazla işlevsellik eklerken.

(function() { // envelop everyting in anonymous immediately called function 
  var proxied = jQuery.fn.setArray; // save current method
  jQuery.fn.setArray = function() { // override the method
    console.log(this, arguments); // add functionality
    return proxied.apply(this, arguments); // call original method and return 
                                           // its result
  };
})();

4
2017-09-11 17:39



Özür dilemediğim için özür dilerim ama neden bir bütün olarak anonim işlev tanımı, parantez içine alınmış ve daha sonra başka bir işlev gibi çağrılır? - NishM
@NishM Bu denir kendi kendini yürüten anonim işlev. Görmek İşte örnek olarak. - ZenMaster
Ah. Muhteşem. Bağlantı için teşekkürler. - NishM


İşte, dinleyicilerin ayarlandığını kaydetmek için kullanılan bir proxy modelinin bir örneği: Google +1 neden fare hareketlerimi kaydediyor?.


0
2017-09-12 02:04





Proxy modeli, başka bir nesne için bir vekil veya yer tutucu nesne sağlar ve bu diğer nesneye erişimi denetler.

Nesne yönelimli programlamada, nesneler kendi aralarında yaptıkları işi yaparlar (özellikler ve yöntemler). Bu nesnelerin müşterileri bu çalışmanın hızlı ve verimli bir şekilde yapılmasını bekler. Bununla birlikte, bir nesnenin ciddi şekilde kısıtlandığı ve sorumluluğunu yerine getiremediği durumlar vardır. Genellikle bu, uzak bir kaynağa bağımlılık olduğunda (ağ gecikmesiyle sonuçlanan) veya bir nesnenin yüklenmesi uzun zaman aldığında oluşur.

Bu gibi durumlarda, Proxy modelini uygular ve orijinal nesne için "içinde" olan bir proxy nesnesi yaratırsınız. Proxy, isteği hedef nesneye iletir. Proxy nesnesinin arabirimi, orijinal nesne ile aynıdır ve istemciler, gerçek nesneden ziyade bir proxy ile uğraştıklarını bile bilmezler.

enter image description here

müşteri - Örnek kodda: run () işlevi

  • Proxy'nin bir işlem istemek için çağırır.

vekil - Örnek kodda: GeoProxy

  • gerçek nesneye benzer bir arayüz sağlar

  • Proxy'nin gerçek nesneye erişmesini sağlayan bir referans tutar

  • istekleri iletir ve bunları gerçek nesneye iletir

RealSubject - Örnek kodda: GeoCoder

  • Hizmet talep edilen gerçek nesneyi tanımlar

0
2017-08-21 04:24



orjinal kaynak dofactory.com/javascript-proxy-pattern.aspx örneklerle - Alexey B.