Sınıflar

ES6, JavaScript'teki "sınıflar" kavramını ortaya atmıştır. Bu kavram, diğer programlama dillerindeki sınıflardan farklıdır. Burada sınıflar, halihazırda veri içeren nesneleri, bu verilerle ilişkilendirilmiş özellikleri ve bu verilerin işlenmesiyle ilgili yöntemleri oluşturmak için şablon görevi gören özel işlevlerdir. Bu nesneler, özellikler ve yöntemler toplu olarak sınıfın "üyeleri" olarak adlandırılır.

Bir sınıfı tanımlamak için class anahtar kelimesini kullanın. En iyi uygulamayı ve JavaScript'in yerleşik kurucu işlevleri tarafından belirlenen kuralı izleyerek bir sınıfın herhangi bir tanımlayıcısına büyük harfle başlayın:

class MyClass {}

Sınıfların, prototiplerin ve kurucu işlevlerin gelişmiş özellikleriyle çalışmak için daha erişilebilir yollar sağlamak amaçlanmıştır:

class MyClass {}

typeof MyClass;
> "function"

Sınıflar, gelişmiş JavaScript özellikleriyle çalışmayı daha kolay ve cazip hale getirmek için kısmen eklendiğinden, bazen "sözdizimsel şeker" olarak da adlandırılır. Ancak sınıflar, prototip devralma ile çalışmak için kullanışlı bir kestirme yol sağlamaktan daha fazlasını yapar. Sınıf söz diziminin kullanıma sunulması, geriye dönük uyumluluk sorunlarına yol açmadan JavaScript'teki uzun süredir var olan tasarım sorunlarını ele almak için fırsatlar sunar. Örneğin, bir sınıfın gövdesindeki tüm kod her zaman katı modda değerlendirilir.

Bir sınıfın örneğini oluşturmak için new operatörünü kullanın.

class MyClass {}

const myClassInstance = new MyClass();

myClassInstance;
> Object { }

Sınıfın gövdesinde tanımlanan işlevler, söz konusu sınıfın her örneğine ait yöntemler olarak gösterilir.

class MyClass {
    classMethod() {
        console.log( "My class method." );
    }
}

const myClassInstance = new MyClass();

myClassInstance.classMethod();
> "My class method."

Sınıf içinde tanımlanan bir yöntem, sonuçta ortaya çıkan örneğin prototipi üzerinde bir yöntem haline gelir. Prototip zincirinin yapısı nedeniyle, bu yöntemleri doğrudan elde edilen nesne üzerinde çağırabilirsiniz:

class MyClass {
  classMethod() {
    console.log( "My class method." );
  }
}

const myClassInstance = new MyClass( "A string." );

myClassInstance;
> Object { }
    <prototype>: Object { … }
        classMethod: function classMethod()
        constructor: class MyClass { constructor(myPassedValue) }
        <prototype>: Object { … }

myClassInstance.classMethod();
> "My class method."

Bir sınıf örneği oluşturulduğunda, yeni oluşturulan örnek için gerekli tüm "kurulumları" gerçekleştiren ve bununla ilişkili tüm özellikleri başlatan özel bir constructor() yöntemi çağrılır. Örnek oluşturulduğunda sınıfa iletilen tüm bağımsız değişkenler constructor() yöntemi tarafından kullanılabilir:

class MyClass {
  constructor( myPassedValue ) {
    console.log( myPassedValue );
  }
}

const myClassInstance = new MyClass( "A string." );
> "A string."

Bir sınıfın gövdesinde, this değeri örneğin kendisini ifade eder ve this üzerinde tanımlanan özellikler, söz konusu sınıfın her bir örneğine ait özellikler olarak gösterilir:

class MyClass {
  constructor( myPassedValue ) {
    this.instanceProperty = myPassedValue;
  }
}

const myClassInstance = new MyClass( "A string." );

myClassInstance;
> Object { instanceProperty: "A string." }

Bu özellikler, sınıfın gövdesindeki tüm yöntemler için de kullanılabilir:

class MyClass {
  constructor( myPassedValue ) {
    this.instanceProp = myPassedValue;
  }
  myMethod() {
    console.log( this.instanceProp );
  }
}

const myClassInstance = new MyClass( "A string." );

myClassInstance.myMethod();
> "A string."

Sınıfınız için bir constructor() tanımlamazsanız JavaScript motoru boş bir "varsayılan" constructor olduğunu varsayar. Her sınıfın constructor() adında yalnızca bir özel yöntemi olabilir:

class MyClass {
  constructor() {}
  constructor() {}
}
> Uncaught SyntaxError: A class may only have one constructor

Sınıf bildirimi veya sınıf ifadesi kullanarak sınıf tanımlayabilirsiniz. Önceki örneklerin tümü, adların new kullanılarak çağrılmasını gerektiren sınıf bildirimleridir. Sınıf ifadeleri "anonim" bir sınıf oluşturmak için adlandırılabilir veya adsız bırakılabilir.

let ClassExpression = class {
    constructor() {}
};

ClassExpression;
> class  {}

Anonim sınıf ifadelerini "hareket halinde" sınıf oluşturan fonksiyonlar için kullanabilirsiniz:

function classMaker() {
  return class {
    constructor() {}
  };
}

let MyVariable = classMaker();

MyVariable;
> class  {}

Sınıf bildirimi kullanarak bir sınıfı yeniden tanımlamak söz dizimi hatasına neden olur:


class MyClass {
    constructor( ) {
        console.log( "My class." );
    }
};

class MyClass {
    constructor() {
        console.log( "My new class." );
    }
};
> Uncaught SyntaxError: redeclaration of class MyClass

Ancak, sınıf ifadeleri, bir sınıfı yeniden tanımlamanıza olanak tanır:

let ClassExpression = class MyClass { };

ClassExpression = class MyOtherClass {
    constructor( myString ) {
        this.myProp = myString;
    }
};

new ClassExpression( "String." );
> MyOtherClass {myProp: 'String.'}

Adlandırılmış bir sınıf ifadesini, bir sınıf beyanında olduğu gibi adlandıramazsınız. Bununla birlikte, bir sınıf ifadesinin atanan adı, oluşturulan örneğin özelliği olarak kullanılabilir. Bu özellik çoğunlukla hata ayıklamayı kolaylaştırır:

let MyVariable = class MyClass {};

MyClass;
> Uncaught ReferenceError: MyClass is not defined

MyVariable;
> class MyClass {}

MyVariable.name;
> "MyClass"

Sınıf ifadesi kullanarak bir değişkeni başlattığınızda, bu değişkenin yükseltme kuralları beklendiği gibi izlenir. Sınıf bildirimleri, let ve const ile aynı "geçici ölü bölge" kurallarını uygular ve geçerli kapsamlarının en üstüne indirilmemiş gibi davranır. Bu, sınıf bildiriminden önce bir sınıfın çağrılması hataya neden olur:

{
    let myVar = new MyClass( "Property string." );

    class MyClass {
        myProp;

        constructor( myString ) {
            this.myProp = myString;
        }
    };
};
> Uncaught ReferenceError: Cannot access 'MyClass' before initialization

Öğrendiklerinizi sınayın

Sınıfı aşağıdakilerden hangisi doğru şekilde tanımlar?

class MyClass {}
myClass = class {}
new class()

Bir sınıfta kaç constructor() yöntemi olabilir?

Bir
Yok
Sınırsız