Sınıf alanları ve yöntemleri

Alanlar

Sınıf alanları, doğrudan bir sınıfın gövdesinde tanımlanır ve this değerinin bir özelliği olarak açık bir şekilde eklenmez. Ancak sonuç aynıdır: ilgili sınıfın örneklerinde tanımlanan bir özellik.

class MyClass {
    myField;
}

const myClassInstance = new MyClass();

myClassInstance;
> MyClass { myField: undefined }

Bir alanı bir değerle başlatabilirsiniz. Bu genellikle sınıf içindeki mantığın üzerine yazabileceği varsayılan bir değerdir:

class MyClass {
    myResult = false;
    set setValue( myValue ) {
        this.myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> Object { myResult: false }

myClassInstance.setValue = true;

myClassInstance;\
> Object { myResult: true }

Sınıf alanları, this kullanılarak sınıfa eklenmiş özelliklerle işlevsel olarak aynıdır. Bu, diğer mülkler gibi, sınıf dışından erişilebilir ve bunlarda değişiklik yapılabilir.

class MyClass {
    myField = true;
}

const myClassInstance = new MyClass();

myClassInstance.myField;
> true

myClassInstance.myField = false;

myClassInstance.myField;
> false;

Alanlar, sınıfların daha gelişmiş özelliklerinden bazıları için temel oluşturur.

Özel alanlar ve yöntemler

Gizli alanlara ve yöntemlere sınıf dışından erişilemez. Özel mülk, bir sınıfın bir örneğiyle ilişkilendirilir. Diğer bir deyişle her örneğin, sınıfta tanımlandığı şekilde kendi özel alan ve yöntem grubu içerir.

Bir mülkü gizli hale getirmek için tanımlayıcıyı tanımlarken başına # ekleyin:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {}
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myPrivateField: true }
    #myPrivateField: true
    <prototype>: Object { … }
        constructor: class MyClass {}
        <prototype>: Object { … }

Gizli alan, kapsayıcı sınıfın gövdesinde bildirilmelidir. Değeri daha sonra this özelliği olarak değiştirebilirsiniz ancak this özelliğini kullanarak alan oluşturamazsınız.

Özel alanlara komut dosyasının başka bir yerinden erişilemez. Bu, veri özelliklerinin içerdikleri değerlerle etkileşimde bulunmak için sağlanan alıcı ve ayarlayıcı yöntemleri dışında değiştirilmesini önler ve yalnızca sınıfın kendi içinde kullanılması amaçlanan yöntemlere doğrudan erişimi engeller.

class MyClass {
    #myResult = false;
    set setValue( myValue ) {
        this.#myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myResult: false }

myClassInstance.#myResult = true;
> Uncaught SyntaxError: reference to undeclared private field or method #myResult

myClassInstance.setValue = true;

myClassInstance;\
> MyClass { #myResult: true }

Bununla birlikte, tarayıcı geliştirici konsollarının hata ayıklama amacıyla özel alanlara erişime izin verme konusunda tutarsız olsa da, genellikle çok serbest olduğunu unutmayın:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> true

myClassInstance.#myPrivateMethod();
> "This is inside a private method."
class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

myClassInstance.#myPrivateMethod();
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateMethod

Özel alanlar, kendilerini içeren sınıfın gövdesine sıkı sıkıya ayarlanır. Diğer bir deyişle, alt sınıflar bile bir üst sınıfla ilişkili özel alanlara erişemez:

class MyClass {
    #myPrivateField = true;
}
class ChildClass extends MyClass {
    childMethod() {
        console.log( this.#myPrivateField );
    }
}
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

Statik alanlar ve yöntemler

Statik alanlar ve yöntemler, ilgili sınıfın örneklerinin üyeleri değil, sınıfın üyeleridir. Bu nedenle statik alanlar, bir sınıfın her örneği için benzersiz olmayacak ancak bu örneklerin referans alması gerekebilecek veriler için merkezi bir nokta sağlar (örneğin, paylaşılan yapılandırma bilgileri). Statik yöntemler genellikle örnekleri içerdikleri bir alana göre karşılaştırmak veya sıralamak gibi bir sınıfın örnekleriyle çalışmak için kullanılan yardımcı işlevlerdir.

Bir sınıfın gövdesinde statik alanları ve yöntemleri tanımlamak için static anahtar kelimesini kullanın:

class MyClass {
    static myStaticField;
    static myStaticMethod() {}
}
const myClassInstance = new MyClass();

Statik bir yöntem oluşturmak için nokta gösterimini de kullanabilirsiniz:

class MyClass {
    constructor() {}
}
MyClass.myStaticMethod = function() {}

Statik özelliklere sınıflarının bir örneğinden erişemezsiniz ancak bu özellikler sınıf kurucuda kullanılabilir:

class MyClass {
    static myStaticField = true;
    static myStaticMethod() {
        console.log( "A static method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance.myStaticField;
> undefined

myClassInstance.myStaticMethod();
> Uncaught TypeError: myClassInstance.myStaticMethod is not a function

MyClass.myStaticField;
> true

MyClass.myStaticMethod();
> "A static method."

Bunlar teknik olarak gerekli değildir, ancak statik yöntemlerin kullanılması, bir sınıfın örnekleriyle çalışacak yardımcı programlar oluşturmak için en iyi uygulamadır. Bir sınıfın örneklerini sıralamak için kullanılan statik bir yöntem veya bir sınıfın örneğini oluşturmak için gerekli tüm ayarları içeren ve ardından sınıf örneğini döndüren statik fabrika yöntemi, buna örnek olarak verilebilir:

class User {
    constructor( name, email ) {
        this.name = name;
        this.email = email;
    }
    static fromObject( myObject ) {
        return new User( myObject.name, myObject.email ?? "Omitted" );
    }
}
const userObject = {
    "name" : "My Name",
    "email" : "my@email.address"
};
const secondUserObject = {
    "name" : "My Name"
};

const firstUser = User.fromObject( userObject );
const secondUser = User.fromObject( secondUserObject );

firstUser;
> Object { name: "My Name", email: "my@email.address" }

secondUser;
> Object { name: "My Name", email: "Omitted" }

Öğrendiklerinizi sınayın

Aşağıdaki alan türlerinden hangilerine yalnızca sınıfın içinden erişilebilir?

Özel alanlar
Sınıf alanları
Static fields