Justin Fagnani açıklar ES2015 içinde, sınıflar sınıf ile oluşturulabilir gerçeğini kullanarak birine birden fazla sınıfları oluşturmak için bir çok temiz (imho) yol ifadeleri .
İfadeler ve bildirimler
Temel olarak, bir ifadeyle bir işlev oluşturabileceğiniz gibi:
function myFunction() {} // function declaration
var myFunction = function(){} // function expression
aynısını sınıflar için de yapabilirsiniz:
class MyClass {} // class declaration
var MyClass = class {} // class expression
İfade, kod çalıştırıldığında çalışma zamanında değerlendirilir, oysa önceden bir bildirim yürütülür.
Mixins oluşturmak için sınıf ifadelerini kullanma
Bunu, yalnızca işlev çağrıldığında dinamik olarak bir sınıf oluşturan bir işlev oluşturmak için kullanabilirsiniz:
function createClassExtending(superclass) {
return class AwesomeClass extends superclass {
// you class body here as usual
}
}
Bununla ilgili harika olan şey, tüm sınıfı önceden tanımlayabilmeniz ve yalnızca işlevi çağırdığınızda hangi sınıfa genişletilmesi gerektiğine karar verebilmenizdir:
class A {}
class B {}
var ExtendingA = createClassExtending(A)
var ExtendingB = createClassExtending(B)
Birden çok sınıfı birlikte karıştırmak istiyorsanız, ES6 sınıfları yalnızca tekli kalıtımı desteklediğinden, karıştırmak istediğiniz tüm sınıfları içeren bir sınıflar zinciri oluşturmanız gerekir. Diyelim ki hem A hem de B'yi genişleten bir C sınıfı oluşturmak istiyorsunuz, bunu yapabilirsiniz:
class A {}
class B extends A {}
class C extends B {} // C extends both A and B
Bununla ilgili sorun, çok durağan olmasıdır. Daha sonra B'yi genişleten ancak A'yı genişletmeyen bir D sınıfı yapmaya karar verirseniz, bir sorununuz var demektir.
Ancak sınıfların ifade olabileceği gerçeğini kullanan bazı akıllıca hilelerle, bunu doğrudan sınıflar olarak değil, sınıf fabrikaları olarak A ve B'yi oluşturarak çözebilirsiniz (kısalık için ok işlevlerini kullanarak):
class Base {} // some base class to keep the arrow functions simple
var A = (superclass) => class A extends superclass
var B = (superclass) => class B extends superclass
var C = B(A(Base))
var D = B(Base)
Hiyerarşiye hangi sınıfların dahil edileceğine yalnızca son anda nasıl karar verdiğimize dikkat edin.