Sınıf alanları ve yöntemleri

Sınıf alanları, açıkça değil doğrudan bir sınıfın gövdesinde tanımlanır this değerinin bir özelliği olarak eklenir. Ancak sonuç aynıdır: bir özellik olarak tanımlanır.

class MyClass {
    myField;
}

const myClassInstance = new MyClass();

myClassInstance;
> MyClass { myField: undefined }

Bir alanı değerle başlatabilirsiniz. Bu genellikle mantığın üzerine yazılabilir:

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ı, sınıfa eklenmiş özelliklerle işlevsel olarak aynıdır this kullanılıyor. Bu, söz konusu dokümanlara sınıfını kullanır.

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 bir temel oluşturur.

Özel alanlar ve yöntemler

Gizli alanlara ve yöntemlere sınıf dışında erişilemez. Özel özelliği, bir sınıfın bir örneğiyle ilişkilendirilir; yani her örnek, sınıfında tanımlandığı şekilde, kendi özel alanları ve yöntemleri grubunu içerir.

Bir mülkü gizli hale getirmek için, aşağıdaki durumlarda tanımlayıcının başına # ekleyin beyan etmeniz gerekir:

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 belirtilmelidir. Şunları yapabilirsiniz: daha sonra this özelliğinin bir özelliği olarak değerini değiştirebilir ancak alanı oluşturamazsınız this kullanılıyor.

Özel alanlara, komut dosyasındaki başka bir yerden erişilemez. Bu işlem, özelliklerinin sağlanan alıcı ve belirleyici yöntemlerinin dışında değiştirilmesini değerlerle etkileşime girmesini engeller ve verilere doğrudan erişimi yöntemlerin yalnızca sınıf içinde kullanılması amaçlanıyor.

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 }

Ancak, tarayıcıların geliştirici konsolları genellikle çok serbest, tutarsız olsa da, hata ayıklama için özel alanlara erişim izni verme amaçlar:

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, bunları içeren sınıfın gövdesine sıkı bir şekilde ayarlanır. Yani, alt sınıflar bile bir ana makineyle ilişkili özel alanlara üst sınıf:

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 sınıfın üyeleri değil, sınıfın üyeleridir. örneklerini kullanın. Bu nedenle, statik alanlar tek bir her örneği için benzersiz olmayan, ancak bu modellerin referans olması gerekebilir (örneğin, paylaşılan yapılandırma bilgileri). Statik yöntemler genellikle bir fonksiyonun örnekleriyle çalışırken sınıflandırılması için kullanılır.

Sınıfın gövdesinde statik alanlar ve yöntemler tanımlamak için static öğesini kullanın. anahtar kelime:

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 kendi sınıflarının bir örneğinden erişemezsiniz, ancak bu özellikler sınıf oluşturucuda 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."

Teknik olarak gerekli değildirler ancak statik yöntemler kullanmak bir sınıfın örnekleriyle çalışmak için yardımcı programlar oluşturma. Buna örnek olarak bir sınıfın örneklerini sıralamaya özel statik bir yöntem veya bir statik veri kümesi bir örneği oluşturmak için gerekli tüm kurulumları içeren fabrika yöntemi class örneğini döndürür ve ardından sınıf örneğini döndürür:

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 içinde nasıl çalışır?

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