Proxy এবং Reflect ES6 (ECMAScript 2015)-এ নতুন ফিচার হিসেবে যুক্ত করা হয়েছে, যা জাভাস্ক্রিপ্ট অবজেক্টের আচরণ পরিবর্তন এবং উন্নত নিয়ন্ত্রণের জন্য ব্যবহৃত হয়। Proxy একটি অবজেক্ট বা ফাংশনকে "wrap" করে তার আচরণ কাস্টমাইজ করতে দেয়, এবং Reflect API টি JavaScript অপারেশনগুলির জন্য একটি সমর্থনমূলক লাইব্রেরি সরবরাহ করে, যাতে আপনি অবজেক্টের উপর কাজ করার জন্য উন্নত ফাংশন ব্যবহার করতে পারেন।
1. Proxy
Proxy একটি অবজেক্ট যা আরেকটি অবজেক্টের আচরণকে হ্যান্ডেল করতে সাহায্য করে। এটি অবজেক্টে করা এক্সেস, আপডেট, প্রপার্টি সেট, এবং অন্যান্য অপারেশনগুলো কাস্টমাইজ বা ট্র্যাক করতে সক্ষম।
Proxy কীভাবে কাজ করে?
Proxy দুইটি অবজেক্ট নেয়:
- Target: এটি মূল অবজেক্ট যার উপর আপনি কাজ করতে চান।
- Handler: এটি একটি অবজেক্ট যা ট্র্যাপস (traps) ধারণ করে। ট্র্যাপ হচ্ছে মেথড যা একটি নির্দিষ্ট অপারেশন ইন্টারসেপ্ট এবং কাস্টমাইজ করে।
Proxy উদাহরণ
const target = {
message: "Hello"
};
const handler = {
get: function(target, prop) {
if (prop in target) {
return target[prop];
} else {
return `Property ${prop} does not exist`;
}
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.message); // "Hello"
console.log(proxy.nonExistent); // "Property nonExistent does not exist"
এখানে, proxy অবজেক্ট target অবজেক্টকে "wrap" করে রেখেছে, এবং handler এর মধ্যে একটি get ট্র্যাপ ব্যবহার করা হয়েছে যা গেট অপারেশনকে কাস্টমাইজ করেছে।
Proxy এর সাধারণ ট্র্যাপস
get(target, prop): একটি প্রপার্টি পড়ার সময় কল হয়।set(target, prop, value): একটি প্রপার্টি সেট করার সময় কল হয়।has(target, prop): প্রপার্টি উপস্থিতি চেক করার সময় কল হয়।deleteProperty(target, prop): প্রপার্টি মুছে ফেলার সময় কল হয়।apply(target, thisArg, args): ফাংশন কল করার সময় কল হয়।
set ট্র্যাপ উদাহরণ
const target = {
message: "Hello"
};
const handler = {
set: function(target, prop, value) {
if (prop === "message") {
value = value.toUpperCase(); // Ensure message is always uppercase
}
target[prop] = value;
return true;
}
};
const proxy = new Proxy(target, handler);
proxy.message = "Goodbye";
console.log(proxy.message); // "GOODBYE"
এখানে, set ট্র্যাপ ব্যবহার করে আমরা নিশ্চিত করছি যে message প্রপার্টি সর্বদা uppercase হয়ে যাবে।
2. Reflect API
Reflect একটি বিল্ট-ইন গ্লোবাল অবজেক্ট যা অবজেক্টের অপারেশনগুলি পরিচালনা করার জন্য ফাংশন প্রদান করে, যেমন get, set, has, deleteProperty ইত্যাদি। Reflect API টি মূলত Proxy ব্যবহার করে অ্যাক্সেস করা যায়, তবে আপনি Reflect API সরাসরি ব্যবহার করেও অবজেক্টের অপারেশনগুলো করতে পারেন। এটি একটি বেশি নিয়ন্ত্রিত উপায় প্রদান করে যেখানে আপনি ফাংশনগুলোকে স্ট্যান্ডার্ড আউটপুট বা অন্য কোনো নির্দিষ্ট আউটপুটের সাথে কাস্টমাইজ করতে পারেন।
Reflect API উদাহরণ
const obj = { name: "Alice" };
console.log(Reflect.get(obj, "name")); // "Alice"
console.log(Reflect.has(obj, "name")); // true
console.log(Reflect.has(obj, "age")); // false
Reflect.set(obj, "name", "Bob");
console.log(obj.name); // "Bob"
এখানে, Reflect API ব্যবহার করা হয়েছে get, set, এবং has অপারেশনগুলো করতে। Reflect API এর মূল সুবিধা হলো এটি কোনো অপারেশন সফলভাবে সম্পন্ন হলে true অথবা ব্যর্থ হলে false ফেরত দেয়, যা প্রথাগত JavaScript অপারেশনগুলো থেকে আলাদা।
Proxy এবং Reflect এর সম্পর্ক
Proxy এবং Reflect একসাথে ব্যবহৃত হতে পারে। যখন আপনি Proxy ট্র্যাপ ব্যবহার করেন, তখন আপনি Reflect API ব্যবহার করে প্রকৃত অবজেক্টে সেই অপারেশনগুলো পাঠাতে পারেন।
Proxy এবং Reflect একত্রে ব্যবহার
const target = { message: "Hello" };
const handler = {
get(target, prop) {
if (prop in target) {
return Reflect.get(...arguments); // Use Reflect to access the actual property
} else {
return `Property ${prop} does not exist`;
}
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.message); // "Hello"
console.log(proxy.nonExistent); // "Property nonExistent does not exist"
এখানে, Reflect.get(...arguments) ব্যবহার করা হয়েছে get ট্র্যাপে, যাতে আমরা মূল target অবজেক্টে প্রপার্টি অ্যাক্সেস করতে পারি।
Proxy এবং Reflect এর ব্যবহারিক সুবিধা
- Proxy: এটি অবজেক্টের আচরণ কাস্টমাইজ করার জন্য ব্যবহৃত হয়। আপনি কাস্টম অ্যাক্সেস, ডেটা ভ্যালিডেশন, লগিং, অথবা অন্য কোন কাজ করতে পারবেন।
- Reflect: এটি অবজেক্ট অপারেশনকে আরো নিয়ন্ত্রিত এবং পরিষ্কারভাবে সম্পন্ন করার জন্য ব্যবহৃত হয়। Reflect এর মাধ্যমে আপনি ট্র্যাপস-এর কার্যকারিতা সহজভাবে এবং আরও সঠিকভাবে পরিচালনা করতে পারবেন।
Proxy ES6-এর একটি অত্যন্ত শক্তিশালী ফিচার যা JavaScript Objects বা Functions এর আচরণ নিয়ন্ত্রণ করতে সক্ষম। এটি একটি নতুন ডেটা টাইপ, যা একটি target object এর ওপর trap বা handler সেট করে, যার মাধ্যমে সেই object এর প্রপার্টি, মেথড, অথবা অ্যাক্সেস প্যাটার্নগুলোর ওপর বিভিন্ন আচরণ পরিবর্তন করা যায়।
Proxy ব্যবহারের মাধ্যমে, আপনি JavaScript এর সাধারণ কার্যক্রম যেমন getter/setter, method invocation, property validation, intercepting operations ইত্যাদি পরিবর্তন বা কাস্টমাইজ করতে পারেন। এটি debugging, logging, validation, performance monitoring বা even security purposes এ খুবই উপকারী হতে পারে।
Proxy সিনট্যাক্স
Proxy তৈরি করতে দুটি প্যারামিটার প্রয়োজন:
- target: এটি একটি সাধারণ object যা আপনার প্রাথমিক object বা function হতে পারে।
- handler: এটি একটি object যেখানে trap (কাস্টম আচরণ) সংজ্ঞায়িত করা হয়।
const target = {
message: "Hello, World!"
};
const handler = {
get: function(target, prop, receiver) {
if (prop in target) {
return target[prop];
} else {
return `Property ${prop} does not exist`;
}
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.message); // "Hello, World!"
console.log(proxy.nonExistent); // "Property nonExistent does not exist"
এখানে, handler object এর get trap ব্যবহার করা হয়েছে, যা প্রতিটি প্রপার্টির জন্য কাস্টম আচরণ নির্ধারণ করেছে। যখন আপনি কোন প্রপার্টি অ্যাক্সেস করবেন, এটি পরীক্ষা করে দেখবে যে সেই প্রপার্টি target object-এ আছে কিনা। যদি না থাকে, তবে একটি কাস্টম মেসেজ রিটার্ন করবে।
Proxy এর প্রধান ট্র্যাপ (Traps)
Proxy এর মাধ্যমে অনেক ধরনের trap নির্ধারণ করা যায় যা object বা function এর ওপর বিভিন্ন কাজ করতে সাহায্য করে। কিছু সাধারণ trap এর মধ্যে রয়েছে:
get(target, prop, receiver): কোনো প্রপার্টি অ্যাক্সেস করার সময় কল হয়।set(target, prop, value, receiver): কোনো প্রপার্টি সেট করার সময় কল হয়।has(target, prop):inঅপারেটর ব্যবহার করার সময় কল হয়।deleteProperty(target, prop):deleteঅপারেটর ব্যবহার করার সময় কল হয়।apply(target, thisArg, argumentsList): function কল করার সময় কল হয়।construct(target, args):newকিওয়ার্ড ব্যবহার করার সময় কল হয়।
Proxy ব্যবহার উদাহরণ
১. Getter এবং Setter এর মাধ্যমে প্রপার্টি নিয়ন্ত্রণ
const person = {
firstName: "John",
lastName: "Doe"
};
const handler = {
get: function(target, prop) {
if (prop === "fullName") {
return `${target.firstName} ${target.lastName}`;
}
return prop in target ? target[prop] : `No such property: ${prop}`;
},
set: function(target, prop, value) {
if (prop === "age" && typeof value !== "number") {
throw new Error("Age must be a number!");
}
target[prop] = value;
}
};
const proxy = new Proxy(person, handler);
console.log(proxy.fullName); // "John Doe"
proxy.age = 30; // Age is set
console.log(proxy.age); // 30
try {
proxy.age = "thirty"; // Error: Age must be a number!
} catch (e) {
console.error(e.message); // Age must be a number!
}
এখানে, get ট্র্যাপ fullName প্রপার্টির জন্য কাস্টম লজিক প্রদান করছে এবং set ট্র্যাপ একটি বৈধতা চেক করছে, যাতে age প্রপার্টি শুধুমাত্র একটি সংখ্যা হতে পারে।
২. Method Invocation (Function Proxy)
const obj = {
greet(name) {
return `Hello, ${name}!`;
}
};
const handler = {
apply: function(target, thisArg, argumentsList) {
console.log(`Called with arguments: ${argumentsList}`);
return target.apply(thisArg, argumentsList);
}
};
const proxy = new Proxy(obj.greet, handler);
console.log(proxy("John")); // Called with arguments: John
// Hello, John!
এখানে, apply ট্র্যাপ ব্যবহার করা হয়েছে যেটি function কল করার সময় কাস্টম লজিক যুক্ত করছে।
Proxy কেন ব্যবহার করা হয়?
Proxy ব্যবহার করার মূল কারণগুলো হলো:
- Logging এবং Debugging: কোডের আচরণ এবং মান কিভাবে পরিবর্তিত হচ্ছে তা ট্র্যাক করতে সাহায্য করে।
- Validation: ডেটার ইনপুট বা মডিফিকেশনকে ভ্যালিডেট করা যায়, যেমন ফাংশন বা অবজেক্ট প্রপার্টি সেট করার সময়।
- Data Binding: ডেটা বাইন্ডিং এবং DOM ম্যানিপুলেশনকে আরও উন্নত করা।
- Access Control: প্রপার্টি অ্যাক্সেস এবং মডিফিকেশনের ওপর নিয়ন্ত্রণ প্রদান।
- Default Behaviors: নির্দিষ্ট ডিফল্ট আচরণ দিয়ে object এর প্রপার্টি বা মেথড গুলি কাস্টমাইজ করা যায়।
Proxy এর সুবিধা
- Dynamic behavior: Proxy ব্যবহার করে আপনি runtime এর সময়ে objects এর আচরণ পরিবর্তন করতে পারেন।
- Cleaner code: এটি কোডের readability এবং maintainability উন্নত করে, বিশেষ করে যখন আপনাকে একই ধরণের অবজেক্ট এর উপর একাধিক আচরণ প্রয়োগ করতে হয়।
- Error Handling: ইন্টারসেপ্টেড কোডের মধ্যে error handling এবং validation যোগ করা সম্ভব।
সারাংশ
Proxy ES6-এর একটি অত্যন্ত শক্তিশালী ফিচার যা target objects বা functions এর আচরণ পরিবর্তন করতে সহায়তা করে। এটি বিভিন্ন ধরনের trap (getter, setter, apply, etc.) প্রদান করে, যার মাধ্যমে আপনি object বা function এর ওপর কাস্টম আচরণ এবং validation প্রয়োগ করতে পারেন। Proxy মূলত debugging, logging, validation, এবং অন্যান্য উন্নত কার্যাবলী সম্পাদন করতে ব্যবহৃত হয়।
ES6 (ECMAScript 2015) Proxy একটি অত্যন্ত শক্তিশালী ফিচার, যা আপনাকে একটি অবজেক্টের (object) আচরণ (behavior) নিয়ন্ত্রণ করার জন্য বিশেষ কৌশল প্রদান করে। Proxy একটি ওয়্র্যাপার (wrapper) অবজেক্ট হিসেবে কাজ করে, যা আপনার কোডের ভেতর কোনো অবজেক্টের প্রপার্টি অ্যাক্সেস, মিউটেশন বা এক্সিকিউশন এর সময় trap ফাংশন ব্যবহার করে তার আচরণ পরিবর্তন করতে পারে। এটি মূলত meta-programming এর অংশ, যেখানে আপনি অবজেক্টগুলোর আচরণকে কাস্টমাইজ করতে পারেন।
Proxy কি?
Proxy একটি অবজেক্ট, যা অন্য একটি অবজেক্টের "প্রক্সি" হিসেবে কাজ করে এবং ঐ অবজেক্টের প্রপার্টি অ্যাক্সেস, সেটিং এবং অন্যান্য অপারেশনগুলো নিয়ন্ত্রণ করে। এটি অবজেক্টের এক্সেস এবং আচরণ কাস্টমাইজ করতে পারে, উদাহরণস্বরূপ, গেট, সেট, চেক বা ডিলিট অপারেশনগুলোর জন্য।
Proxy এর সিনট্যাক্স
const proxy = new Proxy(target, handler);
- target: মূল অবজেক্ট, যার উপর Proxy কাজ করবে।
- handler: একটি অবজেক্ট যা বিভিন্ন "trap" মেথডগুলো ধারণ করে, যেমন
get,set,deleteProperty, ইত্যাদি।
Proxy এর Trap Methods
Proxy এর "trap" মেথডগুলো হল ফাংশন, যা নির্দিষ্ট কাজ (যেমন get, set, delete, etc.) পরিচালনা করে। কিছু সাধারণ "trap" মেথড হলো:
get: একটি প্রপার্টি অ্যাক্সেস করার সময় কল হয়।set: একটি প্রপার্টি সেট করার সময় কল হয়।deleteProperty: একটি প্রপার্টি ডিলিট করার সময় কল হয়।has: একটি প্রপার্টি আছে কিনা তা চেক করার সময় কল হয়।
Proxy এর উদাহরণ
1. get Trap Example
const person = {
name: "Alice",
age: 30
};
const handler = {
get: function(target, prop, receiver) {
if (prop in target) {
return target[prop];
} else {
return `Property ${prop} does not exist!`;
}
}
};
const proxy = new Proxy(person, handler);
console.log(proxy.name); // Alice
console.log(proxy.age); // 30
console.log(proxy.gender); // Property gender does not exist!
এখানে, get trap ব্যবহৃত হয়েছে, যা কোন প্রপার্টি অ্যাক্সেস করার সময় trigger হয়। যদি প্রপার্টি target অবজেক্টে না থাকে, তবে এটি একটি কাস্টম বার্তা প্রদান করবে।
2. set Trap Example
const person = {
name: "Alice",
age: 30
};
const handler = {
set: function(target, prop, value, receiver) {
if (prop === "age" && value < 0) {
console.log("Age cannot be negative!");
return false;
} else {
target[prop] = value;
return true;
}
}
};
const proxy = new Proxy(person, handler);
proxy.age = 25; // Works fine
console.log(proxy.age); // 25
proxy.age = -5; // Age cannot be negative!
console.log(proxy.age); // 25 (unchanged)
এখানে, set trap ব্যবহৃত হয়েছে, যা প্রপার্টি সেট করার সময় কাস্টম লজিক চেক করে। যদি age এর মান নেতিবাচক হয়, তবে সেটি পরিবর্তন হবে না এবং একটি বার্তা প্রদর্শিত হবে।
3. deleteProperty Trap Example
const person = {
name: "Alice",
age: 30
};
const handler = {
deleteProperty: function(target, prop) {
if (prop === "age") {
console.log("Cannot delete age!");
return false; // prevents deletion
} else {
delete target[prop];
return true;
}
}
};
const proxy = new Proxy(person, handler);
delete proxy.name; // Deletes the 'name' property
console.log(proxy.name); // undefined
delete proxy.age; // Cannot delete age!
console.log(proxy.age); // 30 (unchanged)
এখানে, deleteProperty trap ব্যবহৃত হয়েছে, যা একটি প্রপার্টি ডিলিট করার সময় কার্যকর হয়। age প্রপার্টি ডিলিট হতে দেয়া হয়নি।
4. has Trap Example
const person = {
name: "Alice",
age: 30
};
const handler = {
has: function(target, prop) {
if (prop === "age") {
return false; // Pretend 'age' doesn't exist
}
return prop in target;
}
};
const proxy = new Proxy(person, handler);
console.log("name" in proxy); // true
console.log("age" in proxy); // false (even though 'age' exists in the target)
এখানে, has trap ব্যবহার করা হয়েছে, যা একটি প্রপার্টি অস্তিত্ব যাচাই করার সময় কাস্টম লজিক প্রয়োগ করে। age এর অস্তিত্ব অস্বীকার করা হয়েছে।
Proxy এর ব্যবহার
- Data Validation: Proxy এর মাধ্যমে আপনি ডেটা সেট করার সময় প্রপার validation লজিক যোগ করতে পারেন, যেমন negative values reject করা।
- Logging/Monitoring: Proxy ব্যবহার করে অবজেক্টের প্রতিটি অ্যাক্সেস বা পরিবর্তন লগ করা যেতে পারে, যা ডিবাগিং বা ম্যানিটরিং এর কাজে আসতে পারে।
- Object Wrapping: Proxy দিয়ে অবজেক্টের আচরণ পরিবর্তন করা যায়, যেমন একাধিক অবজেক্টের উপর একসাথে কাজ করা বা তাদের কিছু আচরণ নিয়ন্ত্রণ করা।
সারাংশ
Proxy হল একটি শক্তিশালী ES6 ফিচার যা অবজেক্টের আচরণ কাস্টমাইজ এবং নিয়ন্ত্রণ করতে সাহায্য করে। এর মাধ্যমে আপনি অবজেক্টের গেট, সেট, ডিলিট, এবং অন্যান্য কার্যাবলীকে পরিচালনা করতে পারেন। Proxy বিশেষ করে meta-programming এর জন্য ব্যবহৃত হয় এবং এটি অ্যাসিঙ্ক্রোনাস কোড, ডেটা ভ্যালিডেশন, এবং লগিং/মনিটরিংয়ের জন্য খুবই উপকারী।
ES6-এ Reflect API এবং Proxy দুটি শক্তিশালী টুল, যা জাভাস্ক্রিপ্টের অবজেক্ট ম্যানিপুলেশন এবং রিফ্লেকশন কাজকে আরও সহজ এবং শক্তিশালী করে তোলে। Reflect API একটি বিল্ট-ইন অবজেক্ট যা অবজেক্টের মেথডগুলি আরও সুসংহত এবং নিরাপদভাবে কল করার জন্য ডিজাইন করা হয়েছে, এবং Proxy একটি বিশেষ ধরনের অবজেক্ট যা অন্য একটি অবজেক্টের জন্য trap তৈরি করতে পারে, অর্থাৎ তার আচরণ কাস্টমাইজ করা যায়।
1. Reflect API এর ধারণা
Reflect একটি বিল্ট-ইন অবজেক্ট যা অবজেক্টের অপারেশনগুলি (যেমন প্রপার্টি পড়া, লেখা, মুছে ফেলা) আরও সহজ এবং পরিষ্কারভাবে পরিচালনা করতে সাহায্য করে। Reflect API অবজেক্টের অপারেশনগুলো যেমন, get(), set(), has(), deleteProperty() ইত্যাদি মেথডগুলোর সোজা ইন্টারফেস প্রদান করে।
Reflect API এর মেথডসমূহ:
Reflect.get(target, propertyKey): একটি অবজেক্টের প্রপার্টি অ্যাক্সেস করে।const person = { name: 'John', age: 30 }; console.log(Reflect.get(person, 'name')); // "John"Reflect.set(target, propertyKey, value): একটি অবজেক্টে নতুন মান সেট করে।const person = { name: 'John' }; Reflect.set(person, 'name', 'Jane'); console.log(person.name); // "Jane"Reflect.has(target, propertyKey): চেক করে যে, একটি প্রপার্টি অবজেক্টে আছে কিনা।const person = { name: 'John' }; console.log(Reflect.has(person, 'name')); // true console.log(Reflect.has(person, 'age')); // falseReflect.deleteProperty(target, propertyKey): একটি প্রপার্টি মুছে ফেলে।const person = { name: 'John', age: 30 }; Reflect.deleteProperty(person, 'age'); console.log(person); // { name: 'John' }Reflect.apply(target, thisArgument, argumentsList): ফাংশন কল করে এবং তার আর্গুমেন্ট পাঠায়।function greet(name) { return `Hello, ${name}!`; } console.log(Reflect.apply(greet, null, ['Alice'])); // "Hello, Alice!"
2. Proxy এর ধারণা
Proxy একটি বিশেষ ধরনের অবজেক্ট, যা অন্য অবজেক্টের জন্য trap তৈরি করে, অর্থাৎ আপনি যখন কোনো প্রপার্টি অ্যাক্সেস করবেন, সেটি কাস্টমাইজড আচরণ প্রদর্শন করবে। Proxy এর মাধ্যমে আপনি অবজেক্টের প্রপার্টি অ্যাক্সেস, সেট করা, মুছে ফেলা, ফাংশন কল ইত্যাদি intercept (ধরা) করতে পারেন এবং তাদের আচরণ কাস্টমাইজ করতে পারেন।
Proxy এর ব্যবহার:
Proxy এর দুটি প্রধান প্যারামিটার থাকে:
- target: এটি হলো সেই অবজেক্ট, যার জন্য Proxy তৈরি করা হবে।
- handler: এটি একটি অবজেক্ট, যেখানে আপনি বিভিন্ন ট্র্যাপ ফাংশন ডিফাইন করবেন (যেমন,
get,set,has, ইত্যাদি)।
উদাহরণ:
const person = {
name: 'John',
age: 30
};
const handler = {
get: function(target, prop) {
if (prop === 'age') {
return target[prop] + 5; // age কে 5 বছর বড় করে দেখানো হবে
}
return prop in target ? target[prop] : `Property ${prop} not found`;
},
set: function(target, prop, value) {
if (prop === 'age' && value < 0) {
console.log("Age can't be negative");
return false; // বয়স যদি নেগেটিভ হয়, সেট করা যাবে না
}
target[prop] = value;
return true;
}
};
const proxyPerson = new Proxy(person, handler);
console.log(proxyPerson.name); // "John"
console.log(proxyPerson.age); // 35 (5 added to the age)
proxyPerson.age = -5; // "Age can't be negative"
proxyPerson.age = 40;
console.log(proxyPerson.age); // 40
এখানে, handler অবজেক্টের get এবং set ট্র্যাপ ফাংশন ব্যবহার করা হয়েছে যাতে age প্রপার্টির মান পরিবর্তন করা যায় এবং কিছু নির্দিষ্ট শর্ত পূরণ না করলে সেট করা যাবে না।
3. Reflect API এবং Proxy এর সংযুক্ত ব্যবহার
Reflect এবং Proxy একসাথে ব্যবহার করে আরও শক্তিশালী এবং কাস্টমাইজড আচরণ তৈরি করা যায়। উদাহরণস্বরূপ, যখন আপনি কোনো অবজেক্টের জন্য Proxy তৈরি করেন, তখন Reflect ব্যবহার করে আপনি ট্র্যাপগুলিতে ডিফল্ট আচরণ রাখতে পারেন, যাতে আপনি trap এবং default behavior এর মধ্যে সুসংগততা বজায় রাখতে পারেন।
উদাহরণ:
const person = {
name: 'John',
age: 30
};
const handler = {
get: function(target, prop) {
if (prop === 'age') {
return Reflect.get(...arguments) + 5; // age কে 5 বছর বড় করে দেখানো হবে
}
return Reflect.get(...arguments); // Reflect ব্যবহার করা হচ্ছে ডিফল্ট আচরণে
}
};
const proxyPerson = new Proxy(person, handler);
console.log(proxyPerson.age); // 35 (age + 5)
এখানে, Reflect.get(...arguments) ব্যবহার করা হয়েছে যা get ট্র্যাপের মধ্যে default behavior (যেমন, সঠিকভাবে প্রপার্টি রিটার্ন করা) বজায় রাখে।
সারাংশ
- Reflect API অবজেক্টের অপারেশনগুলো সহজভাবে পরিচালনা করার জন্য একটি সহায়ক টুল।
- Proxy অন্য অবজেক্টের আচরণকে কাস্টমাইজ করতে ব্যবহৃত হয় এবং এটি trap ফাংশন দিয়ে নির্দিষ্ট কাজগুলো হ্যান্ডেল করে।
- Reflect এবং Proxy একসাথে ব্যবহার করলে অ্যাসিনক্রোনাস অপারেশন এবং কাস্টম অবজেক্ট বেহেভিয়ার ম্যানিপুলেশন সহজ হয়।
Proxy হল ES6 এর একটি শক্তিশালী ফিচার, যা একটি অবজেক্টের আচরণ নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এটি একটি handler অবজেক্টের মাধ্যমে কার্যকরী হয়, যা অবজেক্টের পদ্ধতিতে (method) বা প্রপার্টিতে (property) কোনো অপারেশন (যেমন: গেট, সেট, ইনপুট, ডিলিট) ঘটলে তা ইন্টারসেপ্ট করে।
একটি সাধারণ ব্যবহার হচ্ছে validation, যেখানে আপনি একটি অবজেক্টের প্রপার্টি সেট করার আগে একটি নির্দিষ্ট শর্ত পরীক্ষা করতে পারেন।
Proxy এর মাধ্যমে Validation:
ধরা যাক, আমাদের একটি অবজেক্ট রয়েছে, যেখানে age নামক একটি প্রপার্টি থাকবে, এবং আমরা চাই এই প্রপার্টির মান যেন 18 এর নিচে না হয়। এই ধরনের validation করতে Proxy ব্যবহার করা যায়, যেখানে set ট্র্যাপের মাধ্যমে আপনি মান সেট করার আগে চেক করতে পারেন।
Proxy উদাহরণ - Age Validation:
// Validation logic for age
const handler = {
set: function(target, prop, value) {
if (prop === 'age' && value < 18) {
console.log('Error: Age must be 18 or above');
return false; // Prevent setting value
}
target[prop] = value;
return true;
}
};
// Creating a Proxy to handle validation
const person = new Proxy({}, handler);
person.name = 'John';
person.age = 25; // Valid
console.log(person); // { name: "John", age: 25 }
person.age = 15; // Error: Age must be 18 or above
console.log(person); // { name: "John", age: 25 } (age is not updated)
এখানে, person অবজেক্টটি একটি Proxy দ্বারা তৈরি করা হয়েছে, এবং set ট্র্যাপ ব্যবহার করে age প্রপার্টির মান যাচাই করা হয়েছে। যদি age 18 এর নিচে সেট করা হয়, তাহলে আমরা একটি Error মেসেজ প্রদর্শন করছি এবং মান সেট হওয়া বন্ধ করে দিচ্ছি।
Proxy এর মাধ্যমে আরো Complex Validation উদাহরণ:
ধরা যাক, আমরা একটি অবজেক্টের বিভিন্ন প্রপার্টি যাচাই করতে চাই। যেমন, name প্রপার্টির জন্য কিছু নির্দিষ্ট নিয়ম (ধরা যাক, নামটি অবশ্যই অক্ষরের সংখ্যা হতে হবে), age প্রপার্টির জন্য বয়সের একটি সীমা (18 এর বেশি) এবং email প্রপার্টির জন্য একটি বৈধ ইমেইল ঠিকানা।
Complex Validation উদাহরণ:
const handler = {
set: function(target, prop, value) {
if (prop === 'age' && (value < 18 || value > 100)) {
console.log('Error: Age must be between 18 and 100');
return false;
}
if (prop === 'name' && !/^[a-zA-Z]+$/.test(value)) {
console.log('Error: Name must only contain letters');
return false;
}
if (prop === 'email' && !/\S+@\S+\.\S+/.test(value)) {
console.log('Error: Invalid email address');
return false;
}
target[prop] = value;
return true;
}
};
const user = new Proxy({}, handler);
// Valid inputs
user.name = "John";
user.age = 30;
user.email = "john.doe@example.com";
console.log(user); // { name: "John", age: 30, email: "john.doe@example.com" }
// Invalid inputs
user.name = "John123"; // Error: Name must only contain letters
user.age = 17; // Error: Age must be between 18 and 100
user.email = "invalid-email"; // Error: Invalid email address
console.log(user); // { name: "John", age: 30, email: "john.doe@example.com" }
এখানে, handler এর মাধ্যমে আমরা একাধিক প্রপার্টি যাচাইয়ের নিয়ম যুক্ত করেছি। যদি age 18 থেকে 100 এর মধ্যে না থাকে, বা name প্রপার্টি শুধুমাত্র অক্ষরের মধ্যে সীমাবদ্ধ না থাকে, অথবা email বৈধ ফরম্যাটে না থাকে, তবে মান সেট করার আগে সংশ্লিষ্ট ত্রুটি বার্তা প্রদর্শন করা হয় এবং set অপারেশন বাধা পায়।
Proxy এবং Validation এর সুবিধা:
- Encapsulation: Proxy ব্যবহার করে, আপনি অবজেক্টের আচরণ পরিবর্তন করতে পারেন, যেমন ডেটা ভ্যালিডেশন, গেট বা সেট অপারেশন নিয়ন্ত্রণ ইত্যাদি, যা আপনাকে ডেটা সুরক্ষা নিশ্চিত করতে সাহায্য করে।
- Complex Validation Logic: অনেক সময় একাধিক শর্ত বা চেকের প্রয়োজন হয়। Proxy এর মাধ্যমে আপনি অত্যন্ত সহজে এবং কার্যকরভাবে এই সমস্ত জটিল validation যুক্ত করতে পারেন।
- Dynamic Behavior: Proxy আপনাকে ডাইনামিকভাবে নতুন ট্র্যাপ বা অপারেশন যোগ করতে দেয়, যা অবজেক্টের আচরণ পরিবর্তন করতে সাহায্য করে।
- Reusability: একবার Proxy তৈরি করলে, এটি পুনরায় অন্য অবজেক্টের জন্য ব্যবহার করা যায়, ফলে কোডের পুনঃব্যবহারযোগ্যতা বেড়ে যায়।
সারাংশ
Proxy ES6 এর একটি শক্তিশালী ফিচার যা আপনাকে অবজেক্টের গেট, সেট, ইনপুট এবং ডিলিট অপারেশন নিয়ন্ত্রণ করতে সক্ষম করে। এর মাধ্যমে আপনি সহজেই ডেটা ভ্যালিডেশন এবং অন্যান্য বৈশিষ্ট্য যেমন লেজি লোডিং, লগিং ইত্যাদি যোগ করতে পারেন।
Read more