الدليل النهائي للرسائل والرسائل في جافا سكريبت
حاصل و اضعي هي وظائف أو الأساليب المستخدمة ل احصل على و جلس قيم المتغيرات. مفهوم getter-setter هو شائع في برمجة الكمبيوتر: جميع لغات البرمجة عالية المستوى تقريبًا تأتي مع مجموعة من بناء الجملة لتطبيق الحروف والأدوات ، بما في ذلك JavaScipt.
في هذا المنشور ، سنرى ما هي أداة تسوية الرسائل ، وكيف إنشاء واستخدامها في جافا سكريبت.
Getters-setters والتغليف
ذكر دائمًا فكرة الأقليات والمستوطنين بالتزامن مع التغليف. يمكن أن يكون التغليف مفهومة بطريقتين.
أولا ، هو إعداد حاصل البيانات واضعي الثلاثي للوصول إلى وتعديل تلك البيانات. هذا التعريف مفيد عندما تكون بعض العمليات ، مثل التحقق من الصحة ، ضرورية أجريت على البيانات قبل الحفظ أو المشاهدة ، يوفر المستوطنون والأدوات المنزلية المثالية له.
ثانياً ، هناك تعريف أكثر صرامة وفقًا لتعبئة الغلاف إخفاء البيانات, لجعلها غير قابلة للوصول من التعليمات البرمجية الأخرى, إلا من خلال getters و setters. بهذه الطريقة لا ينتهي بنا المطاف بطريق الخطأ الكتابة فوق البيانات الهامة مع بعض الرموز الأخرى في البرنامج.
إنشاء getters و setters
1. مع الأساليب
منذ getters والمستوطنين هم وظائف أساسا أن جلب / تغيير قيمة ، هناك أكثر من طريقة لإنشاء واستخدامها. الطريقة الأولى هي:
var obj = foo: 'هذه هي قيمة foo' ، getFoo: function () return this.foo؛ ، setFoo: function (val) this.foo = val؛ console.log (obj.getFoo ())؛ // "هذه هي قيمة foo" obj.setFoo ('hello') ؛ console.log (obj.getFoo ())؛ // "مرحبا"
هذا هو أبسط طريقة لإنشاء getters و setters. هناك خاصية فو
وهناك طريقتان: getFoo
و setFoo
إلى العودة وتعيين قيمة لهذا العقار.
2. مع الكلمات الرئيسية
أكثر “الرسمية” وطريقة قوية لخلق getters و setters باستخدام احصل على
و جلس
الكلمات الدالة.
إلى إنشاء جامع, ضع ال احصل على
الكلمة أمام إعلان الوظيفة الذي سيكون بمثابة طريقة getter ، واستخدام جلس
الكلمة في نفس الطريق إلى إنشاء واضعة. بناء الجملة كالتالي:
var obj = fooVal: 'هذه هي قيمة foo' ، get foo () return this.fooVal؛ ، set foo (val) this.fooVal = val؛ console.log (obj.foo)؛ // "هذه هي قيمة foo" obj.foo = 'hello'؛ console.log (obj.foo)؛ // "مرحبا"
لاحظ أن البيانات يمكن أن تكون فقط تخزينها تحت اسم العقار (fooVal
) هذا مختلف من اسم أساليب getter-setter (فو
) لأن خاصية تحمل المضرب لا يمكن الاحتفاظ بالبيانات كذلك.
الطريقة التي هي أفضل?
إذا اخترت إنشاء getters و setters باستخدام الكلمات الأساسية ، فيمكنك استخدام مشغل الاحالة لضبط البيانات و ال مشغل نقطة للحصول على البيانات, بنفس الطريقة التي يمكنك الوصول إليها / تعيين قيمة خاصية عادية.
ومع ذلك ، إذا اخترت الطريقة الأولى لترميز الحروف والأدوات ، فيجب عليك الاتصال بطريقتي setter و getter باستخدام بناء جملة استدعاء الوظيفة لأنها وظائف نموذجية (لا شيء خاص مثل تلك التي تم إنشاؤها باستخدام احصل على
و جلس
الكلمات الدالة).
أيضا ، هناك فرصة قد ينتهي بك المطاف عن طريق الخطأ تعيين بعض القيمة الأخرى إلى الخصائص التي عقدت تلك الأساليب واضعة و تفقدهم تماما! شيء لا داعي للقلق بشأنه فيما بعد.
لذلك ، يمكنك أن ترى لماذا قلت الأسلوب الثاني هو أكثر قوة.
منع الكتابة
إذا كنت تفضل الأسلوب الأول لسبب ما ، فجرِّب الخصائص التي تحتفظ بطرق getter-setter يقرأ فقط عن طريق خلق لهم استخدام Object.defineProperties
. الخصائص التي تم إنشاؤها عبر Object.defineProperties
, Object.defineProperty
و Reflect.defineProperty
التكوين تلقائيا إلى قابل للكتابة: خطأ
وهو ما يعني يقرأ فقط:
/ * Overwrite Prevention * / var obj = foo: 'هذه هي قيمة foo'؛ Object.defineProperties (obj، 'getFoo': value: function () return this.foo؛، 'setFoo': value: function (val) this.foo = val؛)؛ obj.getFoo = 66 ؛ // getFoo لن يتم استبداله! console.log (obj.getFoo ())؛ // "هذه هي قيمة فو"
عمليات داخل getters والمستوطنين
بمجرد قيامك بتقديم الحروف والأدوات ، يمكنك المضي قدمًا و إجراء عمليات على البيانات قبل تغييره أو إعادته.
في الكود أدناه ، في وظيفة getter تكون البيانات متسلسل مع سلسلة قبل أن يتم إرجاعها ، وفي وظيفة واضعة التحقق من صحة ما إذا كانت القيمة رقم أم لا يتم تنفيذ قبل التحديث ن
.
var obj = n: 67 ، get id () return 'المعرف هو:' + this.n؛ ، ضع المعرف (val) if (typeof val === 'number') this.n = val؛ console.log (obj.id) ؛ // "المعرف هو: 67" obj.id = 893؛ console.log (obj.id)؛ // "المعرف هو: 893" obj.id = 'hello'؛ console.log (obj.id)؛ // "المعرف هو: 893"
حماية البيانات مع getters و setters
حتى الآن ، غطينا استخدام الحروف والأدوات في السياق الأول للتغليف. دعنا ننتقل إلى الثانية ، أي كيف إخفاء البيانات من الرمز الخارجي مع مساعدة من getters والمستوطنين.
بيانات غير محمية
لا يعني إعداد الحروف والأدوات أن البيانات يمكن الوصول إليها فقط وتغييرها عبر تلك الطرق. في المثال التالي ، هو تغيرت مباشرة دون لمس طرق getter و setter:
var obj = fooVal: 'هذه هي قيمة foo' ، get foo () return this.fooVal؛ ، set foo (val) this.fooVal = val؛ obj.fooVal = 'hello'؛ console.log (obj.foo)؛ // "مرحبا"
لم نستخدم واضع ولكن غيرت البيانات مباشرة (fooVal
). البيانات التي وضعناها في البداية في الداخل الكائنات
هو ذهب الآن! لمنع هذا من الحدوث (بطريق الخطأ) ، أنت بحاجة الى بعض الحماية لبياناتك. يمكنك إضافة ذلك بواسطة الحد من النطاق حيث تتوفر بياناتك. يمكنك القيام بذلك عن طريق أي منهما منع النطاق أو وظيفة النطاق.
1. كتلة النطاق
طريقة واحدة هي ل استخدام نطاق كتلة من خلالها سيتم تحديد البيانات باستخدام سمح
الكلمة التي يحد من نطاقه لهذه الكتلة.
ا نطاق كتلة يمكن أن تنشأ عن طريق وضع التعليمات البرمجية الخاصة بك داخل زوج من الأقواس المتعرجة. كلما قمت بإنشاء نطاق كتلة تأكد من اترك تعليقا فوقها يسأل عن ترك الأقواس وحدها ، بحيث لا أحد يزيل الأقواس عن طريق الخطأ التفكير أنهم بعض الأقواس الزائدة زائدة في رمز أو أضف علامة إلى نطاق كتلة.
/ * BLOCK SCOPE ، اترك المشابك وحدها! * / let fooVal = 'هذه هي قيمة foo' ؛ var obj = get foo () return fooVal؛ ، قم بتعيين foo (val) fooVal = val fooVal = 'hello'؛ // لن يؤثر على fooVal داخل block console.log (obj.foo) ؛ // "هذه هي قيمة فو"
تغيير / خلق fooVal
خارج الكتلة لن يؤثر ال fooVal
يشار داخل حراس المستوطنين.
2. وظيفة النطاق
الطريقة الأكثر شيوعًا لحماية البيانات باستخدام النطاق هي حفظ البيانات داخل الوظيفة و إرجاع كائن مع getters و setters من تلك الوظيفة.
الدالة myobj () var fooVal = 'هذه هي قيمة foo' ؛ return get foo () return fooVal؛ ، قم بتعيين foo (val) fooVal = val fooVal = 'hello'؛ // لن يؤثر على fooVal var obj الأصلي = myobj () ؛ console.log (obj.foo)؛ // "هذه هي قيمة فو"
الكائن (مع فو ()
getter-setter بداخلها) عاد بها myobj ()
وظيفة هي تم الحفظ في الكائنات
, وثم الكائنات
يستخدم ل استدعاء واضعة واضعة.
3. حماية البيانات دون تحديد النطاق
هناك أيضًا طريقة أخرى يمكنك من خلالها حماية بياناتك من الكتابة فوقها دون الحد من نطاقها. إن المنطق الذي يقف وراءه ينطبق على هذا النحو: كيف يمكنك تغيير جزء من البيانات إذا كنت لا تعرف ما يسمى?
إذا كانت البيانات تحتوي على ليس من السهل استنساخ اسم المتغير / الممتلكات, لا توجد احتمالية أن ينتهي أحد (حتى أنفسنا) بالكتابة فوقها عن طريق تعيين قيمة إلى اسم المتغير / الخاصية هذا.
var obj = s89274934764: 'this is value of foo' ، get foo () return this.s89274934764؛ ، set foo (val) this.s89274934764 = val؛ console.log (obj.foo)؛ // "هذه هي قيمة فو"
انظر ، هذه طريقة واحدة لعمل الأشياء. على الرغم من أن الاسم الذي اخترته ليس جيدًا بالفعل ، يمكنك أيضًا استخدام القيم العشوائية أو الرموز لإنشاء أسماء العقارات كما هو مقترح من قبل Derick Bailey في منشور المدونة هذا. الهدف الرئيسي هو الحفاظ على البيانات المخفية من رمز آخر والسماح لزوج getter-setter للوصول إلى / تحديثه.
متى يجب عليك استخدام getters و setters?
الآن يأتي السؤال الكبير: هل تبدأ في تعيين الأقواس والأشخاص لجميع البيانات الخاصة بك الآن?
إذا كنت إخفاء البيانات, ثم هناك لا خيار آخر.
ولكن إذا كانت بياناتك التي يتم عرضها بواسطة رمز آخر على ما يرام ، فهل ما زلت بحاجة إلى استخدام أدوات ضبط الحروف فقط لتجميعها مع رمز التي تنفذ بعض العمليات على ذلك؟ أريد أن أقول نعم فعلا. الشفرة يضيف قريبا جدا. إنشاء وحدات متناهية الصغر من البيانات الفردية باستخدام أداة ضبطها الخاصة يوفر لك بعض الاستقلال للعمل على البيانات المذكورة دون التأثير على أجزاء أخرى من التعليمات البرمجية.