حقول الفئات وطرقها

يتمّ الإعلان عن حقول الفئة مباشرةً داخل النص الأساسي للفئة، وليس بشكلٍ صريح المضافة كخاصية لقيمة this. ومع ذلك، فإن النتيجة هي نفسها: محددة على مثيلات تلك الفئة.

class MyClass {
    myField;
}

const myClassInstance = new MyClass();

myClassInstance;
> MyClass { myField: undefined }

يمكنك إعداد حقل بقيمة. غالبًا ما تكون هذه قيمة افتراضية داخل الفئة يمكن أن يستبدل:

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 }

حقول الفئة متطابقة من الناحية الوظيفية مع السمات المرتبطة بالفئة باستخدام this. وهذا يعني أنه يمكن الوصول إليها وتعديلها من خارج الفئة مثل أي خاصية أخرى.

class MyClass {
    myField = true;
}

const myClassInstance = new MyClass();

myClassInstance.myField;
> true

myClassInstance.myField = false;

myClassInstance.myField;
> false;

توفّر الحقول أساسًا لبعض الميزات الأكثر تقدمًا للفئات.

الحقول والطرق الخاصة

يتعذّر الوصول إلى الحقول والطرق الخاصة خارج الصف. ملف شخصي خاص مرتبطة بأحد أمثلة الفئات، مما يعني أن كل مثيل تحتوي على مجموعتها الخاصة من الحقول والطرق الخاصة، كما هو محدد في الفئة.

لجعل ملكية موقع خاص، أضِف # إلى بداية المعرّف في حال أنت تقرّ به:

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

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

يجب الإعلان عن حقل خاص في نص الفئة التي تتضمنه. يمكنك تغيير قيمته لاحقًا كسمة this، ولكن لا يمكنك إنشاء الحقل باستخدام this.

لا يمكن الوصول إلى الحقول الخاصة من أي مكان آخر في النص البرمجي. يمنع هذا الإجراء ظهور البيانات الخصائص من التغيير خارج طرق الإحضار والضبط المقدمة التفاعل مع القيم التي تحتوي عليها، ويمنع الوصول المباشر إلى طرق مخصصة للاستخدام ضمن الفئة نفسها فقط.

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 }

ومع ذلك، ضع في اعتبارك أن المتصفحات وحدات تحكم المطورين بشكل عام متساهلًا جدًا، رغم أنها غير متسقة، بشأن السماح بالوصول إلى الحقول الخاصة لتصحيح الأخطاء الأغراض:

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

الحقول الخاصة تقتصر على النص الأساسي للفئة التي تحتوي عليها، مما يعني أنه حتى الصفوف الفرعية لا يمكنها الوصول إلى الحقول الخاصة المرتبطة الفئة الأم:

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

الطرق والحقول الثابتة

تعتبر الحقول والأساليب الثابتة أعضاء في الفئة نفسها، وليست أعضاء في الفئة المثيلات لتلك الفئة. لهذا السبب، توفر الحقول الثابتة جدولًا مركزيًا نقطة للبيانات التي لن تكون فريدة لكل مثيل في الفئة، ولكن هذه العناصر الأجهزة الافتراضية إلى الرجوع إليها، مثل معلومات الضبط المشتركة. غالبًا ما تكون الطرق الثابتة دوال فائدة للعمل مع مثيلات مثل مقارنة الحالات أو فرزها مقابل حقل تحتوي عليه.

لتحديد الطرق والحقول الثابتة في نص إحدى الفئات، استخدِم السمة static الكلمة الرئيسية:

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

يمكنك أيضًا استخدام تدوين النقاط لإنشاء طريقة ثابتة:

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

لا يمكنك الوصول إلى الخصائص الثابتة من مثيل لفئتها، لكنها المتاحة في الدالة الإنشائية للفئة:

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."

وهي ليست مطلوبة من الناحية الفنية، ولكن استخدام الطرق الثابتة هو أفضل ممارسة إنشاء برامج خدمات للعمل مع مثيلات فئة ما. ومن الأمثلة على ذلك تقوم بتضمين طريقة ثابتة مخصصة لفرز مثيلات فئة ما، أو طريقة ثابتة طريقة المصنع التي تحتوي على أي إعداد ضروري لإنشاء مثيل class ثم تُرجع مثيل الفئة:

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" }

التحقق من فهمك

أي من أنواع الحقول التالية لا يمكن الوصول إليه إلا من خلال داخل الفصل؟

Static fields
حقول الصفوف
الحقول الخاصة