0Pricing
JavaScript Academy · درس

حالات استخدام عملية لـ Proxy

أنشئوا كائنات للتحقق والتسجيل والتفاعل.

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

استخدام Proxies عمليًا

ستجمع الآن بين Proxies وReflect لحل مشكلات واقعية: التحقق والتسجيل والقيم الافتراضية وغير ذلك. يغلّف كل نمط كائنًا عاديًا دون تغييره.

غلاف التحقق

فرض مخطط: ارفض أي كتابة لا تستوفي قاعدةً ما. ويبقى الكائن الهدف سليمًا لأن البيانات غير الصالحة لا تُحفظ فيه.

function validated(obj, rules) {
  return new Proxy(obj, {
    set(target, prop, value, receiver) {
      const rule = rules[prop];
      if (rule && !rule(value)) {
        throw new TypeError('invalid value for ' + prop);
      }
      return Reflect.set(target, prop, value, receiver);
    }
  });
}

const user = validated({}, { age: v => v >= 0 });
user.age = 25;
console.log(user.age);
try { user.age = -1; } catch (e) { console.log(e.message); }

غلاف التسجيل

تتبّع كل قراءة وكتابة لأغراض تصحيح الأخطاء، وذلك بتمرير العملية عبر Reflect بعد تسجيلها.

function logged(obj) {
  return new Proxy(obj, {
    get(t, p, r) { console.log('GET ' + p); return Reflect.get(t, p, r); },
    set(t, p, v, r) { console.log('SET ' + p + '=' + v); return Reflect.set(t, p, v, r); }
  });
}

const data = logged({ count: 0 });
data.count = 5;
console.log(data.count);

القيم الافتراضية

أعد قيمة بديلة لأي خاصية مفقودة، حتى لا تعيد عمليات القراءة القيمة undefined مطلقًا.

function withDefault(obj, fallback) {
  return new Proxy(obj, {
    get(t, p, r) {
      return p in t ? Reflect.get(t, p, r) : fallback;
    }
  });
}

const scores = withDefault({ ada: 90 }, 0);
console.log(scores.ada);
console.log(scores.unknown);

الفهرسة السالبة للمصفوفات

اجعل المصفوفات تدعم الفهارس السالبة بأسلوب Python، وذلك بترجمتها داخل اعتراض get.

function negIndex(arr) {
  return new Proxy(arr, {
    get(t, p, r) {
      const i = Number(p);
      if (Number.isInteger(i) && i < 0) {
        return Reflect.get(t, t.length + i, r);
      }
      return Reflect.get(t, p, r);
    }
  });
}

const list = negIndex(['a', 'b', 'c']);
console.log(list[-1]);
console.log(list[0]);

واجهة للقراءة فقط

اعرض كائنًا يمكن قراءته ولكن لا يمكن الكتابة فيه مطلقًا، وهو أمر مفيد لحماية الإعدادات المشتركة.

function readonly(obj) {
  return new Proxy(obj, {
    set() { console.log('blocked write'); return false; },
    deleteProperty() { console.log('blocked delete'); return false; }
  });
}

const config = readonly({ apiUrl: '/api' });
config.apiUrl = '/hacked';
console.log(config.apiUrl);

عدّ عمليات الوصول

تتبّع عدد مرات قراءة كل خاصية، وذلك بتخزين أعداد القراءات خارج الكائن الهدف.

function counted(obj) {
  const counts = {};
  const proxy = new Proxy(obj, {
    get(t, p, r) {
      counts[p] = (counts[p] || 0) + 1;
      return Reflect.get(t, p, r);
    }
  });
  return { proxy, counts };
}

const { proxy, counts } = counted({ x: 1 });
proxy.x; proxy.x; proxy.x;
console.log(counts.x);

خصائص افتراضية محسوبة

اعرض قيمًا مشتقة لا تُخزَّن، بل تُحسب من جديد عند كل قراءة.

const rect = new Proxy({ width: 4, height: 3 }, {
  get(t, p, r) {
    if (p === 'area') return t.width * t.height;
    return Reflect.get(t, p, r);
  }
});

console.log(rect.area);
rect.width = 10;
console.log(rect.area);

إطلاق خطأ عند القراءات غير المعروفة

اكتشف الأخطاء المطبعية مبكرًا، وذلك بإطلاق خطأ عندما تقرأ الشيفرة خاصية غير موجودة.

function strict(obj) {
  return new Proxy(obj, {
    get(t, p, r) {
      if (typeof p === 'string' && !(p in t)) {
        throw new ReferenceError('unknown property: ' + p);
      }
      return Reflect.get(t, p, r);
    }
  });
}

const o = strict({ name: 'Ada' });
console.log(o.name);
try { console.log(o.naem); } catch (e) { console.log(e.message); }

دمج الاهتمامات

غالبًا ما تجمع الأغلفة الفعلية بين التحقق والتسجيل في معالج واحد، مع تمرير كل اعتراض عبر Reflect.

const account = new Proxy({ balance: 0 }, {
  set(t, p, v, r) {
    if (p === 'balance' && v < 0) throw new RangeError('no overdraft');
    console.log(p + ' set to ' + v);
    return Reflect.set(t, p, v, r);
  }
});

account.balance = 100;
console.log(account.balance);
try { account.balance = -50; } catch (e) { console.log(e.message); }

لماذا تهم هذه الأنماط

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

const observed = new Proxy({ n: 0 }, {
  set(t, p, v, r) {
    const ok = Reflect.set(t, p, v, r);
    console.log(p + ' is now ' + t[p]);
    return ok;
  }
});
observed.n = 1;
observed.n = 2;

تحقق سريع

ما اعتراض Proxy الذي ستستخدمه لرفض القيم غير الصالحة قبل تخزينها؟

مراجعة: حالات الاستخدام العملية لـ Proxy

لقد طبقت Proxies على مشكلات واقعية:

  • يرفض التحقق داخل اعتراض set البيانات غير الصالحة.
  • يتتبّع التسجيل عمليات القراءة والكتابة عبر Reflect.
  • توجد القيم الافتراضية والخصائص الافتراضية داخل اعتراض get.
  • تغلّف واجهات القراءة فقط وعدّ عمليات الوصول والتحقق الصارم من الأخطاء المطبعية الكائنات بصورة شفافة.

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

هل درس «حالات استخدام عملية لـ Proxy» مجاني؟

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

ماذا ستتعلم في «حالات استخدام عملية لـ Proxy»؟

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

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

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

كم من الوقت يستغرق درس «حالات استخدام عملية لـ Proxy»؟

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

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

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

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

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