Mcharek Adel نشر 27 مايو أرسل تقرير نشر 27 مايو في لغات برمجة أخرى مثل java و PHP نعرف attributs بخاصيات مثل private , public , protected... هل ينطبق هذا الكلام على javascript ام لا ؟ و شكرا 4 اقتباس
0 ياسر مسكين نشر 27 مايو أرسل تقرير نشر 27 مايو السلام عليكم ورحمة الله وبركاته، في JavaScript سابقا كانت لا توجد خاصيات وصول مثل private و public و protected كما في Java أو PHP. وجميع الخصائص والدوال في الكائنات تكون قابلة للوصول من الخارج افتراضيا لكن مع ES202 تم إدخال الحقول الخاصة (Private Fields) باستخدام الرمز # قبل اسم الخاصية مثلا نكتب: #privateProperty وهذا يجعل من الخاصية غير قابلة للوصول من خارج الكلاس لكن كما قلت لك قبل ذلك كان المطورون يستخدمون اتفاقيات تسمية مثل البدء بشرطة سفلية _property للإشارة إلى أن الخاصية "خاصة" ولكن هذا مجرد اتفاق وليس فرضا تقنيا حقيقيا. 1 اقتباس
0 محمد_عاطف نشر 27 مايو أرسل تقرير نشر 27 مايو نعم في JavaScript يوجد مفهوم مشابه للخصائص مثل private و public و لكن تطبيقه وطريقة التنفيذ تختلف كثيرا عن اللغات الأخرى مثل Java و PHP وغيرها. قبل ES2022 لم يكن هناك أى إمكانية لجعل الخصائص للصنف خاصة (private) ولكن منذ ES2022 أصبحت JavaScript تدعمها . class Person { #name; // private constructor(name) { this.#name = name; } getName() { return this.#name; } } const p = new Person("Ali"); console.log(p.getName()); console.log(p.#name); لاحظ في المثال السابق لجعل الخاصية private نقوم بوضع علامة # قبلها مما يسمح لنا بإخفائها. وستجد أن أخر سطر في يعطيك رسالة خطأ أن #name هو private. أما protected فليست مدعومة حتى الآن. 1 اقتباس
0 عبد الوهاب بومعراف نشر 27 مايو أرسل تقرير نشر 27 مايو في JavaScript الوضع مختلف تماما عن Java وPHP ففي JavaScript التقليدي جميع الخصائص والدوال تكون public أي أنها عامة بشكل افتراضي بمعنى أنه يمكن الوصول إليها وتعديلها من أي مكان في الكود فلا نجد مثلا كلمات مفتاحية مثل private أو protected كما في اللغات الأخرى. هنا المطورون كانوا يستخدمون اتفاقيات تسمية مثل البدء بشرطة سفلية _property للإشارة إلى أن الخاصية خاصة مثلا لاحظ هنا: class Person { constructor(name, age) { this.name = name; this._age = age; } } const person = new Person("أحمد", 25); console.log(person.name); console.log(person._age); person._age = 30; هنا مع ES2022، تم إدخال الحقول الخاصة الحقيقية باستخدام الرمز # قبل اسم الخاصية، والتي تجعل الخاصية غير قابلة للوصول تماما من خارج الكلاس وهذا أقرب شيء ل private في اللغات الأخرى، لكن لا يوجد ما يعادل protected. class PersonModern { #privateAge; constructor(name, age) { this.name = name; this.#privateAge = age; } getAge() { return this.#privateAge; } } const person2 = new PersonModern("سارة", 28); console.log(person2.name); console.log(person2.getAge()); 1 اقتباس
0 Mustafa Suleiman نشر 27 مايو أرسل تقرير نشر 27 مايو الأمر مختلف بالنسبة لجافاسكريبت، في الإصدارات القديمة للغة، جميع الخصائص والميثودز في كائن JavaScript تكون عامة public، وتستطيع الوصول إليها وتعديلها من أي مكان. وكان يوجد محاكاة لمبدأ التغليف، أي private، وذلك بوضع شرطة سفلية _ كبادئة لاسم الخاصية أو الميثود للإشارة إلى أنها خاصة، وذلك مجرد اصطلاح ولا يمنع الوصول الفعلي، الفكرة لتنبيه المبرمجين الآخرين إلى أن تلك الخواص والميثودز لا ينبغي استخدامها مباشرة من خارج الكائن. لكن يوجد طريقة أخرى من خلال الـ Closures لإنشاء متغيرات وتوابع خاصة حقًا لا يمكن الوصول إليها من خارج الدالة أو الوحدة التي أُنشئت فيها. وصدرت تحديثات في الإصدار ECMAScript 2022 وما بعده حيث أصبح يوجد Private Class Fields أو حقول الكلاس الخاصة، وتم تقديم طريقة رسمية لتعريف حقول خاصة في الكلاسات باستخدام علامة الهاش # كبادئة. class MyClass { #privateField = 10; publicField = 20; constructor() { console.log(this.#privateField); } #privateMethod() { console.log("This is a private method"); } publicMethod() { this.#privateMethod(); console.log("This is a public method accessing private field: " + this.#privateField); } } const instance = new MyClass(); console.log(instance.publicField); instance.publicMethod(); أما بخصوص protected فلا لا يوجد مفهوم protected مباشر ومدمج في JavaScript كما هو الحال في Java أو PHP والذي يسمح بالوصول من الكلاس نفسه والكلاسات الفرعية أي السماح للكلاسات الفرعية بالوصول إلى أعضاء معينة من الكلاس الأب ولكن ليس من الخارج. ولتنفيذ سلوك مشابه بإمكانك الاعتماد على الاصطلاح مثل _protectedMember كما في private سابقًا، أو تصميم الكود بطريقة تسمح بذلك كتمرير الدوال أو استخدام WeakMaps في سيناريوهات معقدة، ولكن لا يوجد كلمة مفتاحية مخصصة لذلك. فالحقول الخاصة # تكون خاصة بالكلاس الذي عُرّفت فيه فقط ولا يمكن للكلاسات الفرعية الوصول إليها مباشرة. 1 اقتباس
السؤال
Mcharek Adel
في لغات برمجة أخرى مثل java و PHP نعرف attributs بخاصيات مثل private , public , protected... هل ينطبق هذا الكلام على javascript ام لا ؟ و شكرا
5 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.