عند الحديث عن علامات الميزات في JS ، أشعر دائمًا أنه غريب بعض الشيء. لماذا تتحدث عن هذه السمة؟ نشأت من سؤال حول مشكلة. نعلم جميعًا أن كائن النافذة هو في الواقع
نظرًا لأن مثيل نافذة المتصفح هو مثيل ، يجب أن يكون لهذا المثيل "خصائص" و "طرق" ، مثل ما يلي:
عندما نستخدم الوظائف ، نحدد بعض الخصائص ، مثل الاسم والعمر وما إلى ذلك ، ويمكننا أيضًا حذف العمليات وتعيينها وتحديثها.
ثم السؤال التالي هو. نظرًا لأنه يمكن تعديل اسم كائن شخصي ديناميكيًا ، وفقًا لهذا المبدأ ، يجب أن أكون قادرًا أيضًا على تعديل القيمة غير المحددة ضمن النافذة ، ثم أنا مهتم جدًا بإلقاء نظرة.
والنتيجة لا تزال يمكن تصورها. لم أقم بتعديل القيمة غير المحددة بنجاح ، فلماذا يحدث هذا؟ لا يوجد سبب. ليس نوع التغليف المذكور في المقالة السابقة ، لكن علينا أن نحترم النتيجة. هذا يدل على أن JS الأساسي يجب أن يكون قد فعل شيء للتسبب في مثل هذه النتيجة. في الواقع ، في JS الأساسي ، يتم استخدام العلم الخاطئ افتراضيًا لجعل السمة غير المحددة غير مكتوبة. دعونا نلقي نظرة عليه بالتفصيل أدناه.
1: ميزة [قابلة للكتابة]
عندما يتعلق الأمر بما إذا كانت السمة قابلة للكتابة ، فقد تفكر في إكسسور GET/SET في C# أو الكلمة الرئيسية للقراءة. أدناه سوف تكون مهتمًا بالتأكيد بكيفية إجراء عملية السمة للقراءة فقط. في JS ، تحتاج فقط إلى استخدام طريقة defineProperty.
من المثال أعلاه ، يمكنك رؤية ثلاثة أشياء ممتعة:
<1>: لقد استخدمت طريقة DefineProperty لتحويل الشخص إلى حقل للقراءة فقط. شخص ما يريد أن يقول أن هذه طريقة من الواضح ، ولكن كيف يمكن أن تكون ميزة؟ في رأيي ، الميزة هي
وضع [xxx] ، لذلك هذا هو الفرق بين JS. بعد كل شيء ، لا يحتوي JS على سكر نحوي ، وبالتالي لا يمكن تحديد خصائص التعريف إلا من خلال الطريقة العامة الأساسية ، أي تحديدها.
<2>: لا أرى فقط قابلة للكتابة في هذه الطريقة ، ولكن أيضًا قابلة للتكوين. إذن ما هذا؟ في الواقع ، هذا هو التكوين الأساسي ، وإخبار محرك JS ما إذا كان يمكنه حذف السمات وتحديثها. عندما أقوم بتعيين قابلة للتكوين على خطأ ، لا يمكنك حذف P.Name ، لأن هذه ستكون عملية غير صالحة.
بعد قراءة هذه ، أعتقد أنك يجب أن تفهم لماذا لا يمكن حذف أو تحديث غير محدد. كلها مصنوعة من علامات غريبة ، هل تعتقد أنها مثيرة للاهتمام للغاية؟
<3>: السؤال التالي الذي يستحق التفكير فيه هو كيف يفعل محرك JS ذلك. هناك أيضًا سمة في C#، وسيتم تسجيل هذه السمة في البيانات الوصفية بعد تجميعها بواسطة المترجم. ثم يمكنك استخدام التفكير للحصول على أي قيمة في سمة الخاص بك. على سبيل المثال ، فئة التسلسل التسلسلية ، التي تخبر SerializableFormat كيفية التفكير في الفئة وقراءةها ، والتي يمكن تسلسلها ، والتي لا يمكن ، وتحتاج إلى استخدام العلامات غير المخصصة.
نسخة الكود كما يلي:
[مسلسل]
اختبار الطبقة العامة
{
[غير محدد]
اسم السلسلة العامة ؛
}
من الشكل ، يمكننا أن نرى أن الاسم غير محدد في IL. نحن نعلم أنه لا يوجد انعكاس في JS ، وبالتالي فإن الاختراق هو بشكل طبيعي في طريقة DefineProperty. لسوء الحظ ، لا يمكننا أن نرى ما يشبه رمز المصدر الأساسي لهذه الطريقة ، لذلك لا نعرف ما الذي يفعله في حقل الاسم لجعله غير قانوني بشكل ديناميكي. لا يمكننا إلا تخمين السلوك الذي قد يحدث في محرك JS بناءً على فهمنا.