6

Şu anda static land belirtimini uygularım (fantezi toprağının alternatifi). Düz nesneleri yalnızca tür olarak değil, aynı zamanda statik yöntemlerle ES2015 sınıflarını da kullanmak istiyorum. Bu statik yöntemleri, normal işlevler yerine kıvrılmış formda ok işlevleri olarak uyguladım. Ancak, bu ES2015 sınıfları ile mümkün değildir:Statik ok işlevli sınıflar

class List extends Array { 
    static map = f => xs => xs.map(x => f(x)) 
    static of = x => [x] 
} 

Benim map gerekmez kendisine ait this, bu sadece List yapıcı bir Körili fonksiyonu olduğu için. Çalıştırmak için static map(f) { return xs => xs.map(x => f(x)) } yazmalıyım, çok sinir bozucu olan şey.

  • Neden ES2015 sınıflarında bir ödev ifadesiyle birlikte ok işlevlerini kullanamıyorum?
  • Yine de amacımı gerçekleştirmek için kısa bir yol var mı?
+1

Her şey durağansa, neden Array'ı genişletir? –

+0

https://stackoverflow.com/questions/32545495/es6-class-instance-properties sayfasının olası kopyası – Bergi

+0

@ T.J.Fikir mevcut bir kütüphane statik arazi uyumlu hale getirmektir. Yani uzatılması gereken statik olmayan özelliklere sahip sınıflar olacak. – ftor

cevap

10

Neden ES2015 sınıflarında bir atama ifadesi ile birlikte ok fonksiyonlarını kullanamıyorum? O ES2015 sınıfı sözdizimi şimdi için —   tasarlanmıştır adil değil nasıl Çünkü

aşağıya sınırının altında bakın.

Yine de hedefime ulaşmanın kısa bir yolu var mı?

Size, hiç bir nesneden çok sınıfları istiyorum bana net değil: (. Sen uzanan ne yaptığınızı için önemli olduğunu söylediniz)

const List = { 
    map: f => xs => xs.map(x => f(x)), 
    of: x => [x] 
}; 

ama (örneğin, örnekleri olacaktır) Array uzatmak ancak daha sonra buna, şu statiği eklemek List isterseniz iki adım gerekir:

class List extends Array { 
} 
Object.assign(List, { 
    map: f => xs => xs.map(x => f(x)), 
    of: x => [x] 
}); 

Bunları numaralandırılamaz veya yapılandırılamayan vb. Istiyorsanız, yerine Object.defineProperties; Ben statik alanlar dahil olmak üzere "alanlar"


sınıf için stage 2 proposal var ... okuyucuya alıştırma olarak o bırakacağım. 4. Aşamaya doğru ilerlerse, sonuç olarak gelecek dil özelliklerinin bir parçası olacaktır (belki de ES2018; bu noktada ES2017'i yapmak için pek olası değil ama asla bilmeyeceksiniz).

Neredeyse tam yolu onları gösterdi sınıf içerisinde bildirilen statik alanları sağlayacak: Eğer Babel ile transpile Eğer

// NOT IN THE LANGUAGE YET, BUT A PROPOSAL AT STAGE 2 
class List extends Array { 
    static map = f => xs => xs.map(x => f(x)); 
    static of = x => [x]; 
} 

, sen Evre 2 önerilerini içerecek şekilde bunu söyleyebilir.

+1

Bağlantı ve hızlı yanıt için teşekkürler. – ftor