Alanlar
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?
Static fields