0Pricing
JavaScript Academy · درس

اعتراضا get وset

خصّصوا قراءات الخصائص وعمليات الكتابة فيها.

اعتراضا get وset درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

اعتراضا get وset

يُعد اعتراضا get وset أكثر روابط Proxy استخدامًا. فهما يعترضان قراءة الخصائص وكتابتها، مما يتيح لك تحويل القيم والتحقق من المدخلات أو تسجيل عمليات الوصول.

توقيع اعتراض get

يُنفَّذ get(target, property, receiver) عند كل قراءة لخاصية. أعد أي قيمة تريد أن يراها المستدعي.

const proxy = new Proxy({ price: 10 }, {
  get(target, prop) {
    return target[prop];
  }
});

console.log(proxy.price);

القيم الافتراضية عبر get

يمكن لاعتراض get توفير قيمة بديلة للخصائص المفقودة بدلًا من إعادة undefined.

const proxy = new Proxy({ a: 1 }, {
  get(target, prop) {
    return prop in target ? target[prop] : 0;
  }
});

console.log(proxy.a);
console.log(proxy.missing);

تحويل القيم عند القراءة

يمكن لاعتراض get إعادة تشكيل القيم أثناء إخراجها، مثل تحويل السلاسل النصية إلى أحرف كبيرة.

const proxy = new Proxy({ name: 'ada' }, {
  get(target, prop) {
    const value = target[prop];
    return typeof value === 'string' ? value.toUpperCase() : value;
  }
});

console.log(proxy.name);

توقيع اعتراض set

يُنفَّذ set(target, property, value, receiver) عند كل عملية كتابة. ويجب أن يعيد true عند النجاح، وإلا فسيُطلق الوضع الصارم خطأً.

const proxy = new Proxy({}, {
  set(target, prop, value) {
    target[prop] = value;
    return true;
  }
});

proxy.x = 5;
console.log(proxy.x);

التحقق في set

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

const person = new Proxy({}, {
  set(target, prop, value) {
    if (prop === 'age' && (typeof value !== 'number' || value < 0)) {
      throw new TypeError('age must be a non-negative number');
    }
    target[prop] = value;
    return true;
  }
});

person.age = 30;
console.log(person.age);
try { person.age = -5; } catch (e) { console.log(e.message); }

تحويل القيم في set

إلى جانب الرفض، يمكن لاعتراض set توحيد المدخلات، مثل إزالة المسافات من السلاسل النصية قبل تخزينها.

const proxy = new Proxy({}, {
  set(target, prop, value) {
    target[prop] = typeof value === 'string' ? value.trim() : value;
    return true;
  }
});

proxy.name = '   Ada   ';
console.log('[' + proxy.name + ']');

تسجيل العمليتين

اجمع بين get وset لتتبع كل عملية وصول. وهذا مفيد جدًا لتصحيح كيفية استخدام الكائن.

const proxy = new Proxy({ v: 1 }, {
  get(target, prop) {
    console.log('GET ' + prop);
    return target[prop];
  },
  set(target, prop, value) {
    console.log('SET ' + prop + ' = ' + value);
    target[prop] = value;
    return true;
  }
});

proxy.v = 42;
console.log(proxy.v);

فرض القراءة فقط

يحوّل اعتراض set الذي يرفض عمليات الكتابة دائمًا Proxy إلى واجهة للقراءة فقط للكائن الهدف.

const readonly = new Proxy({ pi: 3.14 }, {
  set() {
    console.log('writes are blocked');
    return false;
  }
});

try {
  'use strict';
  readonly.pi = 0;
} catch (e) {
  console.log(e.name);
}
console.log(readonly.pi);

مفاتيح Symbol والعمليات الداخلية

تُفعَّل الاعتراضات مع مفاتيح Symbol أيضًا. انتبه: قد يصبح تسجيل كل خاصية، بما فيها الرموز الداخلية، مزعجًا، لذا صفِّ النتائج عند الحاجة.

const proxy = new Proxy({ a: 1 }, {
  get(target, prop) {
    if (typeof prop === 'string') console.log('reading ' + prop);
    return target[prop];
  }
});

console.log(proxy.a);

لماذا يهم اعتراضا get وset

يتيح هذان الاعتراضان معًا التحقق والخصائص المحسوبة والقيم الافتراضية والتسجيل والتفاعلية، وكل ذلك دون تعديل الكائن الهدف. لكن كتابة target[prop] = value يدويًا داخل الاعتراضات تنطوي على حالات خاصة. تتولى واجهة API المسماة Reflect، التي سنتناولها لاحقًا، معالجة هذه الحالات بصورة صحيحة.

const tracked = new Proxy({ total: 0 }, {
  set(target, prop, value) {
    console.log(prop + ' changed to ' + value);
    target[prop] = value;
    return true;
  }
});
tracked.total = 100;
console.log(tracked.total);

تحقق سريع

ما القيمة التي يجب أن يعيدها اعتراض set للإشارة إلى نجاح عملية الإسناد؟

مراجعة: اعتراضا get وset

لقد تعلمت اعتراضات Proxy الأساسية:

  • يعترض get(target, prop, receiver) عمليات القراءة؛ ويمكنه إعادة أي قيمة.
  • يعترض set(target, prop, value, receiver) عمليات الكتابة؛ ويعيد true عند النجاح.
  • استخدمهما للقيم الافتراضية والتحويلات والتحقق والتسجيل.
  • للمعالجة الداخلية الصحيحة داخل الاعتراضات، استخدم Reflect التي سنتناولها لاحقًا.

الأسئلة الشائعة

هل درس «اعتراضا get وset» مجاني؟

نعم — نص درس «اعتراضا get وset» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «اعتراضا get وset»؟

خصّصوا قراءات الخصائص وعمليات الكتابة فيها. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟

لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «اعتراضا get وset»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟

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

جميع الدروس في هذه الدورة

  1. إنشاء Proxy
  2. اعتراضا get وset
  3. واجهة Reflect API
  4. حالات استخدام عملية لـ Proxy
← العودة إلى JavaScript Academy