বছরের পর বছর ধরে, জাভাস্ক্রিপ্ট একটি শক্তিশালী এবং অভিযোজনযোগ্য প্রোগ্রামিং ভাষায় পরিণত হয়েছে, ক্রমাগত বিকাশকারীদের পরিবর্তনশীল চাহিদা মেটাতে বিকশিত হচ্ছে।
এর তুলনামূলকভাবে সাম্প্রতিক অগ্রগতিগুলির মধ্যে একটি হল প্রক্সি অবজেক্ট, যা প্রোগ্রামারদের শক্তিশালী এবং নমনীয় বস্তু তৈরি করতে সক্ষম করে যা অন্যান্য বস্তুর মূল ক্রিয়াকলাপগুলিকে বাধা দিতে এবং পরিবর্তন করতে সক্ষম।
এই নিবন্ধটি জাভাস্ক্রিপ্টে প্রক্সি-এর ক্ষমতা সম্পর্কে বিস্তারিত আলোচনা করে, এর সিনট্যাক্স, বৈশিষ্ট্য, সাধারণ অ্যাপ্লিকেশন, শক্তি, সীমাবদ্ধতা, উদাহরণমূলক উদাহরণ এবং প্রস্তাবিত পদ্ধতিগুলিকে কভার করে।
একটি প্রক্সি হল এমন একটি বস্তু যা অন্য বস্তুকে ঢেকে রাখে এবং এতে মৌলিক ক্রিয়াকলাপগুলিকে বাধা দেয়, যেমন বৈশিষ্ট্যগুলি অ্যাক্সেস করা, বরাদ্দ করা এবং মুছে ফেলা। প্রক্সি জাভাস্ক্রিপ্টের একটি গুরুত্বপূর্ণ দিক যা ডেভেলপারদের আরও বহুমুখী এবং শক্তিশালী কোড লেখার ক্ষমতা দেয়।
এই নিবন্ধটির লক্ষ্য হল জাভাস্ক্রিপ্টে প্রক্সির একটি বিস্তৃত বোধগম্যতা প্রদান করা, এর সিনট্যাক্স, বৈশিষ্ট্য, সুবিধা, ত্রুটি, চিত্র এবং প্রস্তাবিত কৌশলগুলি অন্তর্ভুক্ত করে।
জাভাস্ক্রিপ্টের প্রক্সি হল এমন একটি ক্ষমতা যা অন্যান্য বস্তুতে সম্পাদিত মৌলিক ক্রিয়াকলাপগুলিকে সংশোধন এবং কাস্টমাইজ করতে সক্ষম বস্তু তৈরি করতে দেয়।
একটি প্রক্সি অবজেক্ট স্থাপন করতে, দুটি উপাদান প্রয়োজন: একটি লক্ষ্য বস্তু এবং একটি হ্যান্ডলার বস্তু। টার্গেট অবজেক্ট হল একটি যার উপর অপারেশনগুলিকে আটকাতে হবে, যখন হ্যান্ডলার অবজেক্ট ফাঁদগুলি ধরে রাখার জন্য দায়ী, বা এই অপারেশনগুলি ধরার জন্য ব্যবহৃত পদ্ধতিগুলি।
একটি মৌলিক প্রক্সি অবজেক্ট কীভাবে তৈরি করা যায় তা এখানে একটি উদাহরণ দেখানো হয়েছে:
const target = { name: 'John', age: 25, }; const handler = { get: function(target, prop) { console.log(`Getting property ${prop}`); return target[prop]; }, }; const proxy = new Proxy(target, handler); console.log(proxy.name); // Getting property name // John
এই উদাহরণে, আমরা একটি লক্ষ্য বস্তু তৈরি করি যার দুটি বৈশিষ্ট্য রয়েছে: নাম এবং বয়স। আমরা একটি হ্যান্ডলার অবজেক্টও তৈরি করি যাতে লক্ষ্যবস্তুতে একটি সম্পত্তি পড়ার যেকোনো প্রচেষ্টা ক্যাপচার করার জন্য একটি গেট ট্র্যাপ রয়েছে। এর পরে, আমরা প্রক্সি কনস্ট্রাক্টরকে লক্ষ্য এবং হ্যান্ডলার অবজেক্ট প্রদান করে একটি প্রক্সি অবজেক্ট তৈরি করি। অবশেষে, আমরা প্রক্সি অবজেক্টের নাম বৈশিষ্ট্য পুনরুদ্ধার করি, যা গেট ট্র্যাপকে আহ্বান করে এবং কনসোলে একটি বার্তা আউটপুট করে।
ফাঁদ এমন একটি পদ্ধতি যা লক্ষ্যবস্তুতে ক্রিয়াকলাপকে বাধা দেয়। অনেকগুলি ফাঁদ আছে যা আপনি একটি প্রক্সি অবজেক্টের সাথে ব্যবহার করতে পারেন, যার মধ্যে আছে, গেট, সেট, আছে, ডিলিট প্রপার্টি এবং আরও অনেক কিছু।
এখানে কিছু সাধারণভাবে ব্যবহৃত ফাঁদের একটি সংক্ষিপ্ত বিবরণ দেওয়া হল:
get : এই ফাঁদ টার্গেট অবজেক্টের একটি প্রপার্টি পড়ার চেষ্টাকে বাধা দেয়। এটি দুটি আর্গুমেন্ট লাগে: লক্ষ্য বস্তু এবং সম্পত্তি অ্যাক্সেস করা হচ্ছে. ফাঁদ সম্পত্তির মূল্য ফেরত দেয়।
সেট : এই ফাঁদটি লক্ষ্যবস্তুতে একটি সম্পত্তি স্থাপনের যে কোনো প্রচেষ্টাকে ক্যাপচার করে। এটির জন্য তিনটি পরামিতি প্রয়োজন: লক্ষ্য বস্তুটি নিজেই, যে সম্পত্তিটি প্রতিষ্ঠিত হচ্ছে এবং সেই সম্পত্তির আপডেট করা মান। মেকানিজমের মধ্যে প্রতিষ্ঠিত মান পরিবর্তন করার ক্ষমতা আছে, অথবা এটি মানটিকে প্রতিষ্ঠিত হওয়া থেকে নিষিদ্ধ করার জন্য একটি ত্রুটি তৈরি করতে পারে।
আছে : এই ফাঁদ লক্ষ্য বস্তুতে একটি সম্পত্তি বিদ্যমান কিনা তা পরীক্ষা করার প্রচেষ্টাকে বাধা দেয়। এটি দুটি আর্গুমেন্ট লাগে: লক্ষ্য বস্তু এবং সম্পত্তি চেক করা হচ্ছে। ট্র্যাপটি একটি বুলিয়ান মান প্রদান করে যা নির্দেশ করে যে সম্পত্তিটি বিদ্যমান কিনা।
DeleteProperty : এই ফাঁদ লক্ষ্য বস্তু থেকে একটি সম্পত্তি মুছে ফেলার প্রচেষ্টা বাধা দেয়। এটি দুটি আর্গুমেন্ট লাগে: লক্ষ্য বস্তু এবং সম্পত্তি মুছে ফেলা হচ্ছে। ফাঁদ সম্পত্তি মুছে ফেলতে বা সম্পত্তি মুছে ফেলা থেকে প্রতিরোধ করতে একটি ত্রুটি নিক্ষেপ করতে পারে.
প্রক্সি অবজেক্টের একটি আকর্ষণীয় বৈশিষ্ট্য রয়েছে যা তাদের অকার্যকর করার অনুমতি দেয়, যার ফলে তাদের ফাঁদগুলি লক্ষ্যবস্তুতে ক্রিয়াকলাপকে আর বাধা দেয় না। একটি প্রক্সি অবজেক্ট তৈরি করতে যা অবৈধ হতে পারে, Proxy.revocable()
ফাংশনটি ব্যবহার করুন।
এখানে একটি উদাহরণ:
const target = { name: 'John', age: 25, }; const handler = { get: function(target, prop) { console.log(`Getting property ${prop}`); return target[prop]; }, }; const {proxy, revoke} = Proxy.revocable(target, handler); console.log(proxy.name); // Getting property name // John revoke(); console.log(proxy.name); // Uncaught TypeError: Cannot perform 'get' on a proxy that has been revoked
এই উদাহরণে, আমরা Proxy.revocable()
পদ্ধতি ব্যবহার করে একটি প্রত্যাহারযোগ্য প্রক্সি অবজেক্ট তৈরি করি। তারপরে আমরা প্রক্সি অবজেক্টের নাম সম্পত্তি অ্যাক্সেস করি, যা গেট ট্র্যাপকে ট্রিগার করে এবং কনসোলে একটি বার্তা লগ করে। তারপরে আমরা প্রক্সি অবজেক্টটি প্রত্যাহার করি revoke()
পদ্ধতি ব্যবহার করে, যার মানে হল যে প্রক্সি অবজেক্টে বৈশিষ্ট্যগুলি অ্যাক্সেস করার আরও কোনো প্রচেষ্টা ব্যর্থ হবে।
প্রক্সি অবজেক্টের আরেকটি আকর্ষণীয় বৈশিষ্ট্য হল যে এগুলি জাভাস্ক্রিপ্টে উত্তরাধিকার নিদর্শনগুলি প্রয়োগ করতে ব্যবহার করা যেতে পারে। একটি প্রক্সি অবজেক্টকে অন্য অবজেক্টের প্রোটোটাইপ হিসেবে ব্যবহার করে, আপনি প্রোটোটাইপ চেইনের প্রপার্টি লুকআপগুলিকে আটকাতে এবং কাস্টমাইজ করতে পারেন।
এখানে একটি উদাহরণ:
const parent = { name: 'John', }; const handler = { get: function(target, prop) { console.log(`Getting property ${prop}`); if (!(prop in target)) { return Reflect.get(parent, prop); } return target[prop]; }, }; const child = new Proxy({}, handler); console.log(child.name); // Getting property name // John child.name = 'Bob'; console.log(child.name); // Getting property name // Bob console.log(parent.name); // John
এই উদাহরণে, একটি প্যারেন্ট অবজেক্ট সংজ্ঞায়িত করা হয়েছে এবং একটি নাম বৈশিষ্ট্য আছে। তারপরে, আমরা একটি গেট ট্র্যাপ সহ একটি হ্যান্ডলার অবজেক্ট তৈরি করি যা চাইল্ড অবজেক্টের বৈশিষ্ট্যগুলির জন্য কোনও পড়ার অনুরোধকে বাধা দেয়। ট্র্যাপটি Reflect.get() পদ্ধতি ব্যবহার করে যদি চাইল্ড অবজেক্ট থেকে সম্পত্তি অনুপস্থিত থাকে তাহলে মূল বস্তুতে ফিরে যেতে।
তারপর, প্রোটোটাইপ হিসাবে একটি প্রক্সি অবজেক্ট এবং হ্যান্ডলার হিসাবে হ্যান্ডলার অবজেক্ট ব্যবহার করে, আমরা একটি চাইল্ড অবজেক্ট তৈরি করি। অবশেষে, আমরা চাইল্ড অবজেক্টের নামের সম্পত্তিতে অ্যাক্সেস লাভ করি এবং পরিবর্তন করি, যা কনসোলে গেট এবং সেট ট্র্যাপ এবং লগ মেসেজ বন্ধ করে দেয়।
প্রক্সির জন্য একটি ব্যবহারের ক্ষেত্রে ব্যয়বহুল ফাংশন কল ক্যাশে করা। এই উদাহরণে, আমরা একটি প্রক্সি অবজেক্ট তৈরি করি যা তার আর্গুমেন্টের উপর ভিত্তি করে একটি ফাংশন কলের ফলাফল ক্যাশ করে।
function calculateCost(price, taxRate) { console.log('Calculating cost...'); return price * (1 + taxRate); } const cache = new Map(); const proxy = new Proxy(calculateCost, { apply(target, thisArg, args) { const key = args.join('-'); if (cache.has(key)) { console.log('Returning cached result...'); return cache.get(key); } else { const result = Reflect.apply(target, thisArg, args); cache.set(key, result); return result; } }, }); console.log(proxy(10, 0.2)); // Calculating cost... 12 console.log(proxy(10, 0.2)); // Returning cached result... 12 console.log(proxy(20, 0.2)); // Calculating cost... 24 console.log(proxy(20, 0.3)); // Calculating cost... 26 console.log(proxy(20, 0.3)); // Returning cached result... 26
এই উদাহরণে, আমরা calculateCost
নামক একটি ফাংশন সংজ্ঞায়িত করি যা একটি মূল্য এবং একটি করের হার নেয় এবং ট্যাক্স সহ খরচ ফেরত দেয়। আমরা তখন Map
ক্লাস ব্যবহার করে একটি ক্যাশে অবজেক্ট তৈরি করি।
এর পরে, আমরা proxy
নামে একটি প্রক্সি অবজেক্ট তৈরি করি যা apply
ফাঁদ ব্যবহার করে ফাংশন কলগুলিকে বাধা দেয়। যখনই ফাংশনটি কল করা হয় তখনই apply
ফাঁদ বলা হয় এবং এটি একটি অ্যারে হিসাবে ফাংশন আর্গুমেন্ট গ্রহণ করে। আমরা একটি ক্যাশে কী তৈরি করতে আর্গুমেন্ট ব্যবহার করি এবং ফলাফলটি ইতিমধ্যেই ক্যাশে আছে কিনা তা পরীক্ষা করি। যদি এটা হয়, আমরা ক্যাশে ফলাফল ফেরত. অন্যথায়, আমরা ফলাফল গণনা করি এবং এটি ক্যাশে সংরক্ষণ করি।
অবশেষে, আমরা বিভিন্ন আর্গুমেন্ট ব্যবহার করে proxy
ফাংশন চালু করি এবং লক্ষ্য করি যে ফলাফলটি একই আর্গুমেন্ট সহ পরবর্তী কলগুলির জন্য ক্যাশে সংরক্ষণ করা হয়েছে।
প্রক্সির জন্য আরেকটি ব্যবহারের ক্ষেত্রে বস্তুর বৈশিষ্ট্য যাচাই করা। এই উদাহরণে, আমরা একটি প্রক্সি অবজেক্ট তৈরি করি যা একটি স্ট্রিং সম্পত্তির দৈর্ঘ্য যাচাই করে।
const user = { name: 'John', password: 'secret', }; const proxy = new Proxy(user, { set(target, prop, value) { if (prop === 'password' && value.length < 8) { throw new Error('Password must be at least 8 characters long'); } target[prop] = value; return true; }, }); console.log(proxy.name); // John console.log(proxy.password); // secret proxy.password = '12345678'; console.log(proxy.password); // 12345678 proxy.password = '123'; // Error
এই উদাহরণে, আমরা একটি name
এবং একটি password
বৈশিষ্ট্য সহ user
নামক একটি বস্তুকে সংজ্ঞায়িত করি। তারপরে আমরা proxy
নামে একটি প্রক্সি অবজেক্ট তৈরি করি যা set
ট্র্যাপ ব্যবহার করে সম্পত্তি অ্যাসাইনমেন্টগুলিকে বাধা দেয়। set
ট্র্যাপ বলা হয় যখনই একটি সম্পত্তি বরাদ্দ করা হয়, এবং এটি সম্পত্তির নাম, নতুন মান এবং লক্ষ্য বস্তু গ্রহণ করে।
আমরা set
ট্র্যাপ ব্যবহার করে পরীক্ষা করে দেখি যে প্রপার্টিটি অ্যাসাইন করা হচ্ছে সেটি password
প্রপার্টি এবং যদি মানটি 8 অক্ষরের কম হয়। যদি এটি হয়, আমরা একটি ত্রুটি নিক্ষেপ. অন্যথায়, আমরা লক্ষ্য বস্তুর উপর সম্পত্তি মান সেট.
আমরা proxy
অবজেক্ট ব্যবহার করে password
প্রপার্টিতে বিভিন্ন মান বরাদ্দ করি এবং লক্ষ্য করি যে দৈর্ঘ্যের 8 অক্ষরের নিচে যেকোন মান একটি ত্রুটি ট্রিগার করে।
প্রক্সির জন্য আরেকটি সাধারণ ব্যবহারের ক্ষেত্রে অবজেক্ট সম্পত্তি অ্যাক্সেস এবং অ্যাসাইনমেন্ট লগ করা। এই উদাহরণে, আমরা একটি প্রক্সি অবজেক্ট তৈরি করি যা সম্পত্তি অ্যাক্সেস এবং অ্যাসাইনমেন্ট লগ করে।
const user = { name: 'John', email: '[email protected]', }; const proxy = new Proxy(user, { get(target, prop) { console.log(`Getting ${prop} property`); return target[prop]; }, set(target, prop, value) { console.log(`Setting ${prop} property to ${value}`); target[prop] = value; return true; }, }); console.log(proxy.name); // Getting name property -> John proxy.email = '[email protected]'; // Setting email property to [email protected] console.log(proxy.email); // Getting email property -> [email protected]
এই উদাহরণে, আমরা একটি name
এবং একটি email
বৈশিষ্ট্য সহ user
নামক একটি বস্তুকে সংজ্ঞায়িত করি। তারপরে আমরা proxy
নামে একটি প্রক্সি অবজেক্ট তৈরি করি যা get
এবং set
ফাঁদ ব্যবহার করে সম্পত্তি অ্যাক্সেস এবং অ্যাসাইনমেন্টগুলিকে বাধা দেয়।
যখনই একটি সম্পত্তি অ্যাক্সেস করা হয় তখনই get
ট্র্যাপ বলা হয় এবং এটি সম্পত্তির নাম এবং লক্ষ্য বস্তুটি গ্রহণ করে। এই উদাহরণে, আমরা কনসোলে একটি বার্তা লগ করি যা নির্দেশ করে যে সম্পত্তিটি অ্যাক্সেস করা হচ্ছে এবং তারপরে আমরা লক্ষ্য বস্তু থেকে সম্পত্তির মান ফেরত দিই।
set
ট্র্যাপ বলা হয় যখনই একটি সম্পত্তি বরাদ্দ করা হয়, এবং এটি সম্পত্তির নাম, নতুন মান এবং লক্ষ্য বস্তু গ্রহণ করে। এই উদাহরণে, আমরা কনসোলে একটি বার্তা লগ করি যা নির্দেশ করে যে সম্পত্তিটি বরাদ্দ করা হচ্ছে, এবং তারপর আমরা লক্ষ্য বস্তুতে সম্পত্তির মান সেট করি।
অবশেষে, আমরা proxy
অবজেক্ট ব্যবহার করে বিভিন্ন বৈশিষ্ট্য অ্যাক্সেস করি এবং বরাদ্দ করি এবং পর্যবেক্ষণ করি যে বার্তাগুলি কনসোলে লগ করা হয়েছে।
কাস্টমাইজযোগ্য আচরণ : প্রক্সি অবজেক্টের সাহায্যে, আপনি অন্যান্য অবজেক্টে মৌলিক ক্রিয়াকলাপগুলিকে আটকাতে এবং কাস্টমাইজ করতে পারেন, আপনাকে অ্যাক্সেস নিয়ন্ত্রণ, ক্যাশিং এবং লগিংয়ের মতো উন্নত বৈশিষ্ট্যগুলি তৈরি করতে দেয়৷
উত্তরাধিকার : প্রক্সি অবজেক্টগুলি জাভাস্ক্রিপ্টে উত্তরাধিকার নিদর্শনগুলি প্রয়োগ করার ক্ষমতা অফার করে, যা আরও বহুমুখী এবং স্কেলযোগ্য কোডের দিকে নিয়ে যেতে পারে।
প্রত্যাহারযোগ্য : প্রক্সি অবজেক্টগুলি তৈরি হওয়ার পরে অক্ষম বা প্রত্যাহার করা যেতে পারে, প্রক্সি অবজেক্টের সুযোগ সীমিত করার জন্য বা নিরাপত্তার কারণে তাদের দরকারী করে তোলে।
প্রক্সি দীর্ঘকাল ধরে আমাদের সাথে থাকা সত্ত্বেও, ব্রাউজারগুলির সমস্ত সংস্করণ এই কার্যকারিতা সমর্থন করতে পারে না।
অধিকন্তু, প্রক্সিগুলির ব্যবহার আপনার অ্যাপ্লিকেশনের কার্যকারিতাকে নেতিবাচকভাবে প্রভাবিত করতে পারে, বিশেষ করে যদি আপনি সেগুলিকে প্রায়শই ব্যবহার করেন।
প্রক্সি ব্যবহার করার অর্থ বোঝা গুরুত্বপূর্ণ। এটি অ্যাপ্লিকেশন-সমালোচনামূলক মুহুর্তগুলির জন্য বিশ্বাস করা উচিত নয়, যেমন ব্যবহারকারীর ইনপুটের গুরুত্বপূর্ণ বৈধতা।
বিধিনিষেধ সম্পর্কে সচেতন থাকুন : আপনার কোডে একটি প্রক্সি প্রয়োগ করার আগে, এটি যে বিধিনিষেধ আরোপ করে এবং সেগুলি আপনার অ্যাপ্লিকেশনের গতি এবং নিরাপত্তাকে কীভাবে প্রভাবিত করতে পারে সে সম্পর্কে সচেতন হন।
প্রক্সি অবজেক্টগুলি শুধুমাত্র তখনই ব্যবহার করা উচিত যখন একেবারে অপরিহার্য কারণ তারা আপনার কোডের কার্যকারিতাকে প্রভাবিত করতে পারে।
সাবধানে পরীক্ষা করুন : প্রক্সি অবজেক্ট ব্যবহার করার সময়, সতর্কতার সাথে পরীক্ষা করতে ভুলবেন না এবং সম্ভাব্য অপ্রত্যাশিত আচরণ সম্পর্কে সতর্ক থাকুন।
নিয়মগুলি মেনে চলুন : আপনার কোডটি পড়তে এবং বজায় রাখার জন্য সহজ করতে, প্রক্সি অবজেক্টগুলি বাস্তবায়নের সময় গৃহীত নিয়ম এবং সর্বোত্তম অনুশীলনগুলি মেনে চলুন।
নিবন্ধটি প্রক্সির উন্নত বৈশিষ্ট্যগুলি, যেমন উত্তরাধিকার নিদর্শন এবং প্রত্যাহারযোগ্য প্রক্সি অবজেক্ট তৈরি করার ক্ষমতা নিয়ে আলোচনা করে।
বিকাশকারী হিসাবে আপনার অভিজ্ঞতার স্তর নির্বিশেষে, জাভাস্ক্রিপ্টে প্রক্সি বোঝা আপনার কোডকে উচ্চ স্তরে উন্নীত করার জন্য মৌলিক।
এর অভিযোজনযোগ্যতা এবং ক্ষমতার কারণে, প্রক্সি যেকোন জাভাস্ক্রিপ্ট বিকাশকারীর জন্য একটি গুরুত্বপূর্ণ উপকরণ গঠন করে যারা সহজে জটিল অ্যাপ্লিকেশন তৈরি করতে আগ্রহী।