اعترض العمليات الأساسية للغة بواسطة مصائد Proxy وفوض السلوك الافتراضي بنظافة باستخدام Reflect.
افتح هذا الدرس في Kodokonيغلف Proxy كائنا هدفا ويعترض العمليات الداخلية للغة عبر ثلاث عشرة مصيدة: get، set، has (معامل in)، deleteProperty، ownKeys، apply، construct، وهكذا. يكشف كائن Reflect عن العمليات ذاتها بالضبط كدوال، بنفس التواقيع التي للمصائد. إنه أساس تفاعلية Vue 3، والنماذج الوهمية الديناميكية، وواجهات نمط ORM.
const target = { name: "Ada" };
const traced = new Proxy(target, {
get(obj, prop, receiver) {
console.log("get " + String(prop));
return Reflect.get(obj, prop, receiver);
}
});
traced.name; // get nameلماذا Reflect.get(obj, prop, receiver) بدلا من obj[prop]؟ بسبب المتلقي (receiver). إذا كانت الخاصية موصلا (getter)، فإن Reflect.get يستدعيه مع this مشيرا إلى المتلقي - الوكيل أو كائن يرث منه - بينما obj[prop] سيضبط this على الهدف الخام. بدون المتلقي، تتعطل الموصلات التي تقرأ this حالما يرث كائن من الوكيل.
const base = {
get label() {
return this.name;
}
};
const proxy = new Proxy(base, {
get(target, prop, receiver) {
return Reflect.get(target, prop, receiver);
}
});
const child = Object.create(proxy);
child.name = "Ada";
console.log(child.label); // "Ada" thanks to the receiverحالات الاستخدام الجادة: التحقق عند الكتابة، الخصائص الافتراضية المحسوبة أثناء التنفيذ، التسجيل، التحكم بالوصول (إخفاء المفاتيح المسبوقة بـ _ عبر has وownKeys)، أو الكائنات ذات السلوك الافتراضي. لاحظ أن Reflect.set تعيد قيمة منطقية بدلا من رمي استثناء في الوضع الصارم: يجب أن تنشر مصيدتك تلك القيمة المعادة.
function validated(target) {
return new Proxy(target, {
set(obj, prop, value, receiver) {
if (prop === "age" && !Number.isInteger(value)) {
throw new TypeError("age must be an integer");
}
return Reflect.set(obj, prop, value, receiver);
}
});
}
const user = validated({ age: 30 });
user.age = 31; // ok
// user.age = "old"; // TypeErrorget، لماذا نفضل Reflect.get(target, prop, receiver) على target[prop]؟this الصحيح (المتلقي) بدلا من الهدف الخامtarget[prop] سيعيد إطلاق المصيدة ويسبب تكرارا لا نهائيا"id" in obj؟get تعيد 42 لخاصية هدف قيمتها 1، معلنة غير قابلة للتهيئة وغير قابلة للكتابة. ماذا يحدث؟