SORU
2 NİSAN 2015, PERŞEMBE


ES6 WeakMap asıl kullanım alanları nelerdir?

WeakMap veri yapısı ECMA 6 tanıtıldı asıl kullanım alanları nelerdir?

Zayıf bir haritanın bir anahtar oluşturmaktadır karşılık gelen değeri için güçlü bir referans, zayıf bir harita içine yerleştirilmiş olan bir değer etmesini sağlamakaslauzun anahtar hala hayatta olduğu gibi, memo tablolar, önbelleğe veya normalde başvurular, haritalar zayıf değerlerle, vb zayıf kullanacağınız başka bir şey için kullanılabilir mi yok. için.

Bu bana öyle geliyor ki:

weakmap.set(key, value);

...bu demenin dolambaçlı bir yoludur:

key.value = value;

Ne beton kullanım durumları Gözden kaçırıyorum?

CEVAP
2 NİSAN 2015, PERŞEMBE


Temelde

WeakMaps çöp toplama müdahale etmeden dışarıdan nesneleri genişletmek için bir yol sağlar.Bir nesne ancak mühürlü olduğundan olabilir mi - ya da bir dış kaynaktan uzatmak istediğinizde bir WeakMap uygulanabilir.

Bir WeakMap nerede haritası (sözlük)anahtarlarıtüm başvurular ise, o zayıf olanlar içinanahtarkaybolur ve değer için daha fazla başvuru vardeğerçöp toplanabilir. Hadi o zaman bunu açıkla üzerinden examplesת biraz önce bunu göstermek ve nihayet gerçek bir kullanımı ile bitirin.

Hadi bana belirli bir nesne veren bir API kullanıyorum ki:

var obj = getObjectFromLibrary();

Şimdi, nesne kullandığı bir yöntem var:

function useObj(obj){
   doSomethingWith(obj);
}

Yöntemi ise daha fazla N kere daha olursa, bazı nesne ve bir rapor ile çağrıldı nasıl takip etmek istiyorum. Safça bir Harita kullanmak için düşünür:

var map = new Map(); // maps can have object keys
function useObj(obj){
    doSomethingWith(obj);
    var called = map.get(obj) || 0;
    called  ; // called one more time
    if(called > 10) report(); // Report called more than 10 times
    map.set(obj, called);
}

Bu çalışır, ancak bir bellek sızıntısı - biz şimdi hiç çöp toplanan kütüphane nesneleri tutan her nesne kitaplığı işleve takip etti. Bunun yerine WeakMap: bir kullanabiliriz

var map = new WeakMap(); // create a weak map
function useObj(obj){
    doSomethingWith(obj);
    var called = map.get(obj) || 0;
    called  ; // called one more time
    if(called > 10) report(); // Report called more than 10 times
    map.set(obj, called);
}

Ve bellek sızıntısı yok.

Durumlarda kullanın

Aksi takdirde, bellek sızıntısına neden olur ve WeakMaps tarafından etkinleştirilen bazı kullanım örnekleri şunlardır:

  • Belirli bir nesne hakkında özel veri tutmak ve sadece Haritaya bir referans olan kişiler için erişim sağlayacak. Ad-hoc bir yaklaşım daha özel semboller teklifi geliyor ama bundan sonra çok uzun bir süre.
  • Onları değiştirmeden kütüphane nesneler hakkında veri tutmak veya yükü ödemeden.
  • Birçok gizli sınıfları ile ilgili sorunlar değil tabi var nesnelerin küçük bir set hakkında veri JS motorları tutmak aynı türden nesneler için kullanın.
  • Host ile ilgili bir veri depolama nesneleri tarayıcıda DOM gibi.
  • Dışarıdan bir nesne için bir yetenek olayı diğer cevabı ibret verici gibi) ekleyerek.

Gerçek bir kullanın bakalım

Dışarıdan bir nesne genişletmek için kullanılabilir. ... İo.js gerçek dünyadan (adapte, bir tür gerçek bir şey anlatmak için) pratik bir örnek vereyim.

Hadi io.js dile ve bunu ancak Promise - şimdi tüm şu anda reddetti sözleri takip etmek istediğiniz nesneler vardeğilbaşvuru onlara mevcut durumda, çöplük olmaktan onları tutmak istiyorum.

Şimdi, senyokbilinen nedenlerle yerel nesneler için özellikler eklemek istiyorum - sıkıştın. Eğer başvurular, yok eğer yok çöp toplama gerçekleşebilir beri bir bellek sızıntısı sebep olduğun sözler için başvurular devam edersen - tek tek sözleri hakkında ek bilgi kurtaramazsın. Söz KİMLİĞİ tasarrufu ile ilgili herhangi bir düzeni doğal olarak bir başvuru gerekir.

WeakMaps Girin

WeakMaps bu demekanahtarlarızayıf. Zayıf bir harita numaralandır ya da tüm değerleri almak için yolu vardır. Zayıf bir harita verileri bir anahtar dayalı olarak saklayın ve anahtarını çöp değerlerin toplanan çok zaman alır.

Bu söz verilen bu konuda devlet saklayabileceğiniz ve nesne hala çöplük anlamına gelir. Eğer herhangi bir devlet varsa kontrol edebilirsiniz bir nesne ile ilgili ve bu rapor için bir referans alırsanız daha sonra.

Bu unhandled rejection hooks uygulamak this Petka Antonov tarafından kullanıldı:

process.on('unhandledRejection', function(reason, p) {
    console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
    // application specific logging, throwing an error, or other logic here
});

Bir haritada sözler hakkında bilgi tutmak ve reddedilen bir söz ele ne zaman olduğunu biliyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012
  • Visual Life

    Visual Life

    3 Temmuz 2006