কীভাবে ES6 শ্রেণি সত্যিই কাজ করে এবং কীভাবে নিজের তৈরি করতে পারে

ECMAScript এর 6 ষ্ঠ সংস্করণ (বা সংক্ষেপে ES6) ভাষাটি বিপ্লব করেছে এবং ক্লাস এবং শ্রেণিভিত্তিক উত্তরাধিকার সহ অনেকগুলি নতুন বৈশিষ্ট্য যুক্ত করেছে। নতুন সিনট্যাক্সটি বিশদ না বুঝে ব্যবহার করা সহজ এবং বেশিরভাগই আপনি প্রত্যাশা করেন। তবে আপনি যদি আমার মতো হন তবে এটি সম্পূর্ণ সন্তোষজনক নয়। আপাতদৃষ্টিতে জাদুকরী বাক্য গঠনটি কীভাবে হুডের নীচে কাজ করে? এটি কীভাবে ভাষার অন্যান্য ক্রিয়াকলাপের সাথে যোগাযোগ করে? ক্লাস সিনট্যাক্স ছাড়া ক্লাস অনুকরণ করা সম্ভব? আমি এখানে এই প্রশ্নের উত্তর দিতে হবে।

যাইহোক, ক্লাসগুলি বুঝতে, আপনাকে প্রথমে বুঝতে হবে তাদের আগে কী এসেছিল এবং জাভাস্ক্রিপ্ট কী অবজেক্টের ভিত্তিতে তৈরি।

অবজেক্ট মডেল

জাভাস্ক্রিপ্ট অবজেক্ট মডেল বেশ সহজ। প্রতিটি বস্তু সম্পত্তি বিবরণীতে কেবল স্ট্রিং এবং চিহ্নগুলির ম্যাপিং। প্রতিটি সম্পত্তি বর্ণনাকারী পরিবর্তিত গণনা করা বৈশিষ্ট্যগুলির জন্য একটি গেটর / সেটার জুড়ি বা সাধারণ ডেটা বৈশিষ্ট্যের জন্য একটি ডেটা মান রাখে।

আপনি যখন কোড foo [বার] চালান, এটি বারটিকে স্ট্রিংয়ে রূপান্তর করে, যদি এটি ইতিমধ্যে স্ট্রিং বা প্রতীক না হয়। এরপরে এটি foo- এর বৈশিষ্ট্যগুলিতে এই কীটি সন্ধান করে এবং সংশ্লিষ্ট সম্পত্তির মান প্রদান করে (বা এর গিটার ফাংশনটিকে প্রযোজ্য হিসাবে ডাকে)। বৈধ শনাক্তকারীগুলির জন্য আক্ষরিক স্ট্রিং কীগুলির শর্ট সিনট্যাক্স foo.bar থাকে, যা foo ["বার"] এর সমতুল্য। এতদূর, এত সহজ।

প্রোটোটাইপ উত্তরাধিকার

জাভাস্ক্রিপ্টকে প্রোটোটাইপিকাল ইনরিয়েন্স বলা হয় যা ভীতিজনক মনে হয় তবে এটি হ্যাং হয়ে যাওয়ার পরে traditionalতিহ্যগত শ্রেণিভিত্তিক উত্তরাধিকারের চেয়ে আসলে সহজ। প্রতিটি বস্তুর একটি প্রোটোটাইপ নামক অন্য বস্তুর অন্তর্নিহিত পয়েন্টার থাকতে পারে। যদি আপনি কোনও কীটির সাথে কোনও সম্পত্তি নেই এমন কোনও বস্তুর কোনও সম্পত্তি অ্যাক্সেস করার চেষ্টা করেন তবে পরিবর্তে এটি প্রোটোটাইপ অবজেক্টের জন্য কীটি সন্ধান করবে এবং যদি বিদ্যমান থাকে তবে সেই কীটির জন্য প্রোটোটাইপ সম্পত্তি ফিরিয়ে দেবে। যদি এটি প্রোটোটাইপে বিদ্যমান না থাকে তবে প্রোটোটাইপের প্রোটোটাইপটি পুনরাবৃত্তভাবে পরীক্ষা করা হয় এবং যতক্ষণ না কোনও সম্পত্তি পাওয়া যায় বা প্রোটোটাইপ ছাড়াই কোনও অবজেক্ট না পাওয়া পর্যন্ত।

আপনি যদি পাইথন আগে ব্যবহার করেন তবে বৈশিষ্ট্য অনুসন্ধান প্রক্রিয়াটি একই রকম। পাইথনে, প্রতিটি অ্যাট্রিবিউট প্রথমে ইনস্ট্যান্স ডিকশনারিতে দেখা হয়। যদি এটির অস্তিত্ব না থাকে, রানটাইম উত্তরাধিকার শ্রেণিবিন্যাস পর্যন্ত শ্রেণিক অভিধান, সুপারক্লাস অভিধান ইত্যাদি পরীক্ষা করে। জাভাস্ক্রিপ্টে, প্রক্রিয়াটি একই রকম, কেবলমাত্র প্রকারের বস্তু এবং উদাহরণের বস্তুর মধ্যে কোনও পার্থক্য নেই - প্রতিটি বস্তু অন্য বস্তুর প্রোটোটাইপ হতে পারে। অবশ্যই, আসল বিশ্বে লোকেরা খুব কমই এই সত্যটি ব্যবহার করে এবং পরিবর্তে তাদের কোডটি শ্রেণীর মতো শ্রেণিবিন্যাসে সংগঠিত করে কারণ এর সাথে কাজ করা সহজ, যার কারণে জাভাস্ক্রিপ্ট প্রথম স্থানে শ্রেণি বাক্য গঠন যুক্ত করেছে।

অভ্যন্তরীণ স্লট

যদি কোনও বস্তুটি কেবলমাত্র বৈশিষ্ট্যের কীগুলির ম্যাপিং হয় তবে প্রোটোটাইপটি কোথায় সংরক্ষণ করা হয়? উত্তরটি হ'ল, বৈশিষ্ট্যগুলি ছাড়াও, সামগ্রীর অভ্যন্তরীণ পদ্ধতি এবং অভ্যন্তরীণ স্লট রয়েছে যা ভাষা স্তরে বিশেষ শব্দার্থবিজ্ঞান প্রয়োগ করতে ব্যবহৃত হয়। অভ্যন্তরীণ স্লটগুলি কোনওভাবেই জাভাস্ক্রিপ্ট কোডের মাধ্যমে সরাসরি অ্যাক্সেস করা যায় না। তবে কিছু ক্ষেত্রে অপ্রত্যক্ষভাবে এটি অ্যাক্সেস করার উপায় রয়েছে। অবজেক্ট প্রোটোটাইপগুলি স্লট [[প্রোটোটাইপ]] দ্বারা প্রতিনিধিত্ব করা হয়, উদাহরণস্বরূপ, যা অবজেক্ট.জেটপ্রোটোটাইপ () বা অবজেক্ট.সেটপ্রোটোটাইপফ () দিয়ে পড়া এবং লেখা যায়। অভ্যন্তরীণ স্লট এবং পদ্ধতিগুলি সাধারণ বৈশিষ্ট্য থেকে পৃথক করতে ডিফল্টরূপে ডাবল বর্গাকার বন্ধনীগুলিতে আবদ্ধ থাকে।

ওল্ড স্টাইলের ক্লাস

জাভাস্ক্রিপ্টের পূর্ববর্তী সংস্করণগুলিতে নিম্নলিখিত কোডগুলি সহ শ্রেণীর অনুকরণ করা সাধারণ অনুশীলন ছিল।

এটা কোথা থেকে এসেছে? প্রোটোটাইপ কোথা থেকে এসেছে? নতুন কী? দেখা গেল, জাভাস্ক্রিপ্টের প্রথম দিকের সংস্করণগুলিও খুব বেশি অপ্রচলিত হতে চায়নি। সুতরাং তারা এমন বাক্য গঠন অন্তর্ভুক্ত করেছিল যা আপনি এমন শ্রেণীর মতো দেখতে এমন কোডগুলি ব্যবহার করতে পারেন like

প্রযুক্তিগত দৃষ্টিকোণ থেকে জাভাস্ক্রিপ্টে ফাংশনগুলি দুটি অভ্যন্তরীণ পদ্ধতি [[কল]] এবং [[গঠন]] দ্বারা সংজ্ঞায়িত করা হয়েছে। [[কল]] পদ্ধতিযুক্ত প্রতিটি বস্তুকে একটি ফাংশন বলা হয় এবং প্রতিটি ফাংশন যা একটি [[গঠন]] পদ্ধতি ধারণ করে তাকে কনস্ট্রাক্টর বলা হয় ¹ [[কল]] পদ্ধতিটি নির্ধারণ করে যে আপনি যখন কোনও বস্তুটিকে একটি ফাংশন হিসাবে কল করেন তখন কী হয় e foo (আরগস), [[রচনা]] যখন আপনি এটিকে নতুন এক্সপ্রেশন হিসাবে ডাকে তখন কী ঘটে তা নির্ধারণ করে, অর্থাত্ নতুন ফু বা নতুন ফু (আরগস)।

সাধারণ ফাংশন সংজ্ঞাগুলির জন্য, [[কনস্ট্রাক্ট]] কল করা সুস্পষ্টভাবে একটি নতুন অবজেক্ট তৈরি করে যার [[প্রোটোটাইপ]] এটি কনস্ট্রাক্টর ফাংশনের প্রোটোটাইপ সম্পত্তি, যদি এই সম্পত্তিটি বিদ্যমান থাকে এবং কোনও অবজেক্ট ভ্যালু, বা অন্যথায় অবজেক্ট.প্রোটোটাইপ থাকে। নতুন তৈরি বস্তুটি ফাংশনের স্থানীয় পরিবেশের মধ্যে এই মানটির সাথে আবদ্ধ। যদি ফাংশনটি কোনও বস্তু ফেরত দেয় তবে নতুন অভিব্যক্তিটি সেই অবজেক্টের বিরুদ্ধে মূল্যায়ন করা হয়; অন্যথায়, নতুন প্রকাশটি স্পষ্টভাবে তৈরি মানটির বিরুদ্ধে মূল্যায়ন করা হয়।

প্রোটোটাইপ সম্পত্তি নিখুঁতভাবে তৈরি করা হয় যখন আপনি একটি সাধারণ ফাংশন সংজ্ঞায়িত করেন। "প্রোটোটাইপ" নামের একটি সম্পত্তি প্রতিটি নতুন সংজ্ঞায়িত ফাংশনটিতে সংজ্ঞায়িত করা হয়, যার মান একটি নতুন নির্মিত বস্তু। এই অবজেক্টের পরিবর্তে একটি কনস্ট্রাক্টর সম্পত্তি রয়েছে যা মূল ফাংশনটির উল্লেখ করে। মনে রাখবেন যে এই প্রোটোটাইপ সম্পত্তিটি [[প্রোটোটাইপ]] স্লটের মতো নয়। পূর্ববর্তী কোড উদাহরণে, ফু কেবল একটি ফাংশন, তাই প্রোটোটাইপটি বিল্ট-ইন ফাংশন prপ্রোটোটাইপ অবজেক্ট।

সবুজ এবং নীল কালো এবং সম্পত্তি সম্পর্কের মধ্যে [[প্রোটোটাইপ] সম্পর্কের সাথে পূর্ববর্তী কোড উদাহরণের সাথে চিত্রিত এখানে একটি চিত্র রয়েছে dia

পূর্ববর্তী কোড উদাহরণের জন্য প্রোটোটাইপ স্তরক্রম ডায়াগ্রাম

[1] এটা সম্ভব যে আপনার [[রচনা]] পদ্ধতিতে অবজেক্ট রয়েছে এবং একটি [[কল]] পদ্ধতি নয়, তবে ইসমাস্ক্রিপ্টের স্পেসিফিকেশন এই জাতীয় সামগ্রীর সংজ্ঞা দেয় না। অতএব সমস্ত নির্মাণকারী ফাংশন হয়।

[২] সাধারণ ফাংশন সংজ্ঞা দ্বারা আমি বলতে চাইছি নিয়মিত ফাংশন কীওয়ার্ড দিয়ে সংজ্ঞায়িত ফাংশন এবং => ফাংশন, জেনারেটর ফাংশন, অ্যাসিঙ্ক্রোনাস ফাংশন, পদ্ধতি ইত্যাদির চেয়ে বেশি কিছুই ES6 এর পূর্বে অবশ্যই এই ফাংশন সংজ্ঞা ছিল type

নতুন স্টাইল ক্লাস

এটি মাথায় রেখে, এটি এখন ES6 শ্রেণির সিনট্যাক্স পরীক্ষা করার সময়। পূর্ববর্তী কোড উদাহরণটি সরাসরি নতুন সিনট্যাক্সে সরাসরি অনুবাদ করে:

আগের মতো, প্রতিটি শ্রেণিতে একটি কনস্ট্রাক্টর ফাংশন এবং প্রোটোটাইপ অবজেক্ট থাকে, যা প্রোটোটাইপ এবং কনস্ট্রাক্টর বৈশিষ্ট্যগুলির মাধ্যমে একে অপরকে উল্লেখ করে। তবে দুজনের সংজ্ঞাটির ক্রমটি বিপরীত। পুরানো স্টাইলের ক্লাসের সাহায্যে আপনি কনস্ট্রাক্টর ফাংশনটি সংজ্ঞায়িত করেন এবং প্রোটোটাইপ অবজেক্টটি আপনার জন্য তৈরি করা হয়। একটি নতুন স্টাইলের ক্লাসের সাথে, শ্রেণীর সংজ্ঞার মূল অংশটি প্রোটোটাইপ অবজেক্টের বিষয়বস্তুতে পরিণত হয় (স্থির পদ্ধতি ব্যতীত) এবং এর অধীনে আপনি কোনও নির্মাতার সংজ্ঞা দেন। উভয় ক্ষেত্রেই শেষ ফলাফল একই রকম।

সুতরাং, যদি ES6 শ্রেণির বাক্য গঠনটি কেবল পুরানো শৈলীর "ক্লাস" এর জন্য চিনি হয় তবে এটি কী? নতুন শ্রেণীর সিনট্যাক্সটি কেবল আরও ভাল দেখায় এবং সুরক্ষা চেক যোগ করে না, তবে এটি কার্যকারিতাও সরবরাহ করে যা ES6 এর আগে অসম্ভব, বিশেষত শ্রেণিভিত্তিক উত্তরাধিকার ছিল। নতুন সিনট্যাক্সের সাহায্যে শ্রেণি নির্ধারণ করার সময়, আপনি ক্লাসের উত্তরাধিকার সূত্রে উত্তমরূপে একটি সুপারক্লাস সরবরাহ করতে পারেন যা নীচে দেখানো হয়েছে:

এই কোডটি এখনও কোনও শ্রেণিক বাক্য গঠন সহ অনুকরণ করা যায়, যদিও প্রয়োজনীয় কোডটি খুব খারাপ।

শ্রেণিভিত্তিক উত্তরাধিকারের সাথে, নিয়মটি সহজ: জোড়াটির প্রতিটি অংশের একটি প্রোটোটাইপ হিসাবে সুপারক্লাসের অনুষঙ্গযুক্ত অংশ থাকে। সুতরাং সুপারক্লাস কনস্ট্রাক্টর হ'ল সাবক্লাস কনস্ট্রাক্টরের প্রোটোটাইপ এবং সুপারক্লাস প্রোটোটাইপ অবজেক্ট সাবক্লাস প্রোটোটাইপ অবজেক্টের প্রোটোটাইপ। চিত্রের উদ্দেশ্যে এখানে একটি চিত্র রয়েছে (কেবলমাত্র [[প্রোটোটাইপস] দেখানো হয়েছে; স্পষ্টতার জন্য বৈশিষ্ট্যগুলি বাদ দেওয়া হয়))।

শ্রেণি সিনট্যাক্স ছাড়াই এই [[প্রোটোটাইপ]] সম্পর্ক স্থাপনের কোনও প্রত্যক্ষ এবং সুবিধাজনক উপায় নেই। যাইহোক, আপনি সেগুলি ObS.setPrototypeOf () ব্যবহার করে ম্যানুয়ালি সেট করতে পারেন, যা ES5 তে চালু হয়েছিল।

যাইহোক, উপরোক্ত উদাহরণটি নির্দিষ্ট করে কনস্ট্রাক্টরগুলিতে কিছু করা থেকে বিরত থাকে। বিশেষত, সুপার একটি নতুন সিনট্যাক্স এড়ায় যার সাহায্যে সাবক্লাসগুলি সুপারক্লাসের বৈশিষ্ট্য এবং নির্মাতাকে অ্যাক্সেস করতে পারে। এটি আরও জটিল এবং বাস্তবে ES5 তে সম্পূর্ণরূপে অনুকরণ করা যায় না, যদিও এটি ES6 এ শ্রেণীর বিন্যাস ছাড়াই বা প্রতিবিম্বের মাধ্যমে অনুকরণ করা যায়।

প্রথম শ্রেণীর রিয়েল এস্টেটের প্রবেশাধিকার

সুপারক্লাস কনস্ট্রাক্টরকে কল করার বা সুপারক্লাসের বৈশিষ্ট্য অ্যাক্সেস করার দুটি উপায় রয়েছে। দ্বিতীয় কেসটি সহজ, সুতরাং আমরা প্রথমে এটি কভার করব।

এটি যেভাবে কাজ করে তা হ'ল প্রতিটি ফাংশনের একটি অভ্যন্তরীণ স্লট [[HomeObject]] থাকে যা এতে অবজেক্টটি ধারণ করে যেখানে ফাংশনটি মূলত যখন কোনও পদ্ধতি হিসাবে সংজ্ঞায়িত করা হত। শ্রেণীর সংজ্ঞায় এই বস্তুটি শ্রেণীর প্রোটোটাইপ অবজেক্ট; এইচ। ফু.প্রোটোটাইপ যদি আপনি সুপার.ফু বা সুপার ["ফু" "] এর মাধ্যমে কোনও সম্পত্তি অ্যাক্সেস করেন তবে এটি [[হোমঅজেক্ট]] এর সমতুল্য। [[প্রোটোটাইপ]]। ফু।

পর্দার আড়ালে সুপার কীভাবে কাজ করে তার এই বোঝার সাথে, আপনি জটিল এবং অস্বাভাবিক পরিস্থিতিতে এমনকি এটি কীভাবে আচরণ করবে তা অনুমান করতে পারেন। উদাহরণস্বরূপ, কোনও ফাংশনের [[HomeObject]] সংজ্ঞা সময়ে সেট করা থাকে এবং নীচে দেখানো অনুসারে আপনি পরে অন্য ফাংশনগুলিকে ক্রিয়াকলাপটি প্রদান করলেও পরিবর্তন হয় না।

উপরের উদাহরণে আমরা ডিপ্রোটোটাইপে মূলত সংজ্ঞায়িত একটি ফাংশন নিয়েছি এবং বি.প্রোটোটাইপে এটি অনুলিপি করেছি। যেহেতু হোমঅবজেক্ট এখনও ডি.প্রোটোটাইপকে নির্দেশ করে, তাই সুপার অ্যাক্সেস ডি প্রোটোটাইপের প্রোটোটাইপে দেখায় যা সি প্রোটোটাইপ। ফলাফল সি এর বি প্রোটোটাইপ চেইনে কোথাও না থাকলেও foo এর C কপি বলা হয়।

তেমনি, [[HomeObject]] সত্য। [[প্রোটোটাইপ]] প্রতিবারই সুপারপ্রেসেশনটি মূল্যায়ন করা হয়, [[প্রোটোটাইপ]] এ পরিবর্তন করা হয় এবং নীচে দেখানো হিসাবে নতুন ফলাফলগুলি ফিরে আসে।

পার্শ্ব দ্রষ্টব্য হিসাবে, সুপার শ্রেণীর সংজ্ঞায় সীমাবদ্ধ নয়। এটি যে কোনও ফাংশন দ্বারা ব্যবহার করা যেতে পারে যা কোনও নতুন পদ্ধতির সংক্ষিপ্ত ফর্মের সাথে কোনও বস্তুর আক্ষরিক সংজ্ঞায়িত হয়। এক্ষেত্রে, [[HomeObject]] হ'ল আবদ্ধ বস্তু। অবশ্যই, কোনও বস্তুর আক্ষরিকের [[প্রোটোটাইপ] সর্বদা অবজেক্ট.প্রোটোটাইপ, সুতরাং আপনি নীচে বর্ণিত প্রোটোটাইপটিকে ম্যানুয়ালি পুনরায় সাইন না করা পর্যন্ত এটি বিশেষভাবে কার্যকর নয়।

সুপার বৈশিষ্ট্য অনুকরণ

আমাদের পদ্ধতির জন্য ম্যানুয়ালি [[HomeObject]] সেট করার কোনও উপায় নেই, তবে আমরা নীচে দেখানো হিসাবে কেবল মানটি সঞ্চয় করে এবং সমাধানটি নিজেই করে তা অনুকরণ করতে পারি। এটি দুর্দান্ত লেখার মতো সুবিধাজনক নয়, তবে কমপক্ষে এটি কার্যকর হয়।

দ্রষ্টব্য যে আমাদের সঠিক পদ্ধতিটি সঠিক মান সহ ডাকা হয়েছে তা নিশ্চিত করার জন্য .call (এটি) ব্যবহার করা উচিত। যদি পদ্ধতির এমন কোনও সম্পত্তি থাকে যা কোনও কারণে ফাংশন.প্রোটোটাইপ.callকে ছাপিয়ে যায়, তবে আমরা এর পরিবর্তে ফাংশন.প্রোটোটাইপ.কল কল (foo, এটি) বা রিফ্লেক.এপ্লি (foo, এটি) ব্যবহার করতে পারি, যা আরও নির্ভরযোগ্য তবে আরও ভার্বোজ ।

স্থির পদ্ধতিতে দুর্দান্ত

আপনি সুপার স্ট্যাটিক পদ্ধতিও ব্যবহার করতে পারেন। স্ট্যাটিক পদ্ধতিগুলি নিয়মিত পদ্ধতির মতো হ'ল প্রোটোটাইপ অবজেক্টের পরিবর্তে কনস্ট্রাক্টর ফাংশনে বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত করা হয়।

সুপারকে সাধারণ পদ্ধতির মতো স্থির পদ্ধতিগুলির মধ্যে এমুলেট করা যায়। পার্থক্যটি হ'ল [[HomeObject]] এখন কনস্ট্রাক্টর ফাংশন, প্রোটোটাইপ অবজেক্ট নয়।

দুর্দান্ত ডিজাইনার

যখন কোনও সাধারণ কনস্ট্রাক্টর ফাংশনের [[কনস্ট্রাক্ট]] পদ্ধতিটি কল করা হয়, তখন একটি নতুন অবজেক্ট স্পষ্টভাবে ফাংশনে এই মানটির সাথে তৈরি হয় এবং আবদ্ধ হয়। তবে সাবক্লাস নির্মাণকারীরা বিভিন্ন বিধি অনুসরণ করেন। এই মানটি স্বয়ংক্রিয়ভাবে তৈরি হয় নি এবং এটি অ্যাক্সেস করার চেষ্টা করার ফলে একটি ত্রুটি হবে। পরিবর্তে, আপনাকে সুপার (আরগস) এর মাধ্যমে সুপারক্লাস নির্মাণকারীকে কল করতে হবে। সুপারক্লাস নির্মাণকারীর ফলাফলটি এই মানের স্থানীয় মানের সাথে আবদ্ধ হয়। তারপরে আপনি সাবক্লাস নির্মাণকারী হিসাবে এটি যথারীতি অ্যাক্সেস করতে পারেন।

অবশ্যই, যদি আপনি একটি পুরানো স্টাইলের ক্লাস তৈরি করতে চান যা নতুন স্টাইলের ক্লাসগুলির সাথে সঠিকভাবে কাজ করতে পারে তবে এটি সমস্যাযুক্ত। কোনও পুরানো স্টাইলের ক্লাসটি কোনও নতুন স্টাইলের ক্লাসের অধীনে থাকলে সমস্যা নেই, যেহেতু উভয় ক্ষেত্রেই বেস ক্লাসের কনস্ট্রাক্টর কেবল একটি সাধারণ কনস্ট্রাক্টর ফাংশন। তবে, একটি পুরানো শৈলীর শ্রেণীর সাথে একটি নতুন শৈলীর শ্রেণীর সাবক্লাসিং সঠিকভাবে কাজ করে না কারণ পুরাতন স্টাইলের কনস্ট্রাক্টর সবসময় বেস কনস্ট্রাক্টর থাকে এবং সাবক্লাস কনস্ট্রাক্টরের কোনও বিশেষ আচরণ নেই।

ধরুন আমাদের কাছে একটি নতুন স্টাইলের ক্লাস বেস রয়েছে, যার সংজ্ঞাটি অজানা এবং এটি পরিবর্তন করা যায় না এবং বেসে কোডের সাথে সামঞ্জস্য রেখে আমরা একটি ক্লাস সিনট্যাক্স ছাড়াই এটি উপ-বিভাগ করতে চাই, যা একটি আসল সাবক্লাসের প্রত্যাশা করে।

প্রথমে ধরে নেওয়া যাক বেস প্রক্সিগুলি বা অনির্দিষ্ট গণিত বৈশিষ্ট্য বা অন্য কোনও অস্বাভাবিক কিছু ব্যবহার করে না, যেহেতু আমাদের সমাধান সম্ভবত বেসের বৈশিষ্ট্যগুলিকে বিভিন্ন সময় বা একটি বাস্তব সাবক্লাসের চেয়ে আলাদা অর্ডারে অ্যাক্সেস করতে পারে এবং এটি সম্পর্কে আমরা কিছুই করতে পারি না।

তারপরে প্রশ্ন উঠেছে যে কীভাবে কনস্ট্রাক্টরের কল চেইন সেট আপ হয়। সাধারণ সুপার প্রোপার্টি হিসাবে, আমরা সহজেই অবজেক্ট.জেটপ্রোটোটাইপফ (হোমঅজেক্ট)। কনস্ট্রাক্টর সহ সুপার ক্লাস কনস্ট্রাক্টর পেতে পারি। তবে কীভাবে আপনি এটি কল করতে পারেন? ভাগ্যক্রমে, আমরা কনস্ট্রাক্টর ফাংশনের অভ্যন্তরীণ [[নির্মাণ]] পদ্ধতিটিকে ম্যানুয়ালি কল করতে আমরা রিফ্লেক্ট কনস্ট্রাক্ট () ব্যবহার করতে পারি।

এই বাঁধাইয়ের নির্দিষ্ট আচরণ অনুকরণ করার কোনও উপায় নেই। তবে, আমরা কেবল এটিকে উপেক্ষা করতে পারি এবং নীচের উদাহরণে "$ এটি" নামক "আসল" মান সংরক্ষণ করতে একটি স্থানীয় ভেরিয়েবল ব্যবহার করতে পারি।

রিটার্নটি লক্ষ্য করুন - এটি; উপরে লাইন। মনে রাখবেন যে যখন কোনও কনস্ট্রাক্টর ফাংশন কোনও অবজেক্ট ফিরিয়ে দেয়, তখন সেই বস্তুটি স্পষ্টভাবে তৈরি মানটির পরিবর্তে নতুন এক্সপ্রেশনটির মান হিসাবে ব্যবহৃত হয়।

কার্যোদ্ধার? বেশ না। উপরের উদাহরণে আপত্তি মানটি আসলে সন্তানের উদাহরণ নয়; এইচ। এর প্রোটোটাইপ চেইনে কোনও চাইল্ড.প্রোটোটাইপ নেই। এটি কারণ বেসের কনস্ট্রাক্টর শিশু সম্পর্কে কিছুই জানতেন না, সুতরাং এটি এমন একটি বস্তু ফিরিয়েছিল যা বেজের কেবল একটি সাধারণ উদাহরণ ছিল (তার [[প্রোটোটাইপ]] হল বেস.প্রোটোটাইপ)।

বাস্তব ক্লাসগুলির জন্য এই সমস্যাটি কীভাবে সমাধান করা হবে? [[কনস্ট্রাক্ট]] এবং এভাবেই প্রতিচ্ছবি প্রতিস্থাপনে তিনটি পরামিতি লাগে। তৃতীয় প্যারামিটার, নিউ টার্জেটটি সেই কনস্ট্রাক্টরকে বোঝায় যা মূলত নতুন এক্সপ্রেশনে ডাকা হয়েছিল এবং এভাবে উত্তরাধিকারক্রমক্রমের নিম্নতম (সর্বাধিক প্রাপ্ত) শ্রেণীর নির্মাতা। নিয়ন্ত্রণ প্রবাহ বেস শ্রেণীর নির্মাণকারীর কাছে পৌঁছানোর সাথে সাথে, স্পষ্টভাবে তৈরি করা অবজেক্টটির প্রোটোটাইপ হিসাবে নতুন টার্গেট রয়েছে।

সুতরাং আমরা বেসটি কনস্ট্রাক্টরকে রিফ্লেক্ট কনস্ট্রাক্ট (কনস্ট্রাক্টর, আরগস, চাইল্ড) এর মাধ্যমে কল করে সন্তানের একটি উদাহরণ তৈরি করতে পারি। এটি এখনও পুরোপুরি সত্য নয়, তবে অন্য কেউ যখন শিশুকে জমা দেয় তখন সর্বদা বাধাগ্রস্ত হয়। শিশু শ্রেণীর হার্ডকোডিংয়ের পরিবর্তে, আমাদের অপরিবর্তিতভাবে নতুন টার্গেটের মাধ্যমে পুনরাবৃত্তি করতে হবে। ভাগ্যক্রমে, এটি বিশেষ নতুন.আরগারেট সিনট্যাক্স ব্যবহার করে নির্মাণকারীর মধ্যে থেকে অ্যাক্সেস করা যায়। এটি নিম্নলিখিত চূড়ান্ত সমাধানের দিকে নিয়ে যায়:

শেষ কাজ

এটি ক্লাসগুলির সমস্ত প্রধান ফাংশনকে কভার করে, তবে কয়েকটি ছোটখাটো পার্থক্য রয়েছে, প্রধানত সুরক্ষা চেকগুলি যা নতুন শ্রেণীর বাক্য গঠনতে যুক্ত হয়েছে। উদাহরণস্বরূপ, ফাংশন সংজ্ঞাগুলিতে স্বয়ংক্রিয়ভাবে যুক্ত হওয়া প্রোটোটাইপ সম্পত্তি ডিফল্টরূপে লিখিত হয়, তবে শ্রেণি নির্মাতাদের প্রোটোটাইপ সম্পত্তি লিখিত হয় না। আমরা খুব সহজেই অবজেক্ট.ডিফাইনপোপার্টি () কল করে আমাদের অ-লিখনযোগ্য করতে পারি। বিকল্প হিসাবে, আপনি যদি পুরো জিনিসটি অপরিবর্তনীয় রাখতে চান তবে অবজেক্ট.ফ্রিজে () কেও কল করতে পারেন।

আরেকটি নতুন সুরক্ষা হ'ল শ্রেণীর নির্মাতারা যদি নতুন দিয়ে নির্মাণের পরিবর্তে তাদের কল করার চেষ্টা করে তবে তারা টাইপরর ফেলে দেবে। উপরের আমাদের কনস্ট্রাক্টর একটি টাইপররও ছুঁড়ে ফেলেছে তবে কেবল পরোক্ষভাবে, যেহেতু ফাংশন [[কল]] এড হয় তবে নিউ.টারেট অপরিজ্ঞাত হয় এবং আপনি যদি স্পষ্টভাবে শেষ যুক্তি হিসাবে অনির্ধারিত পাস করেন তবে রিফ্লেক্ট কনস্ট্রাক্ট () টাইপরর ফেলে দেয়। যেহেতু এখানে টাইপ এরির এলোমেলো, ফলস্বরূপ ত্রুটি বার্তাটি বেশ বিভ্রান্তিকর। নতুন.অর্টেজের জন্য একটি স্পষ্ট চেক যোগ করা সহায়ক হতে পারে যা আরও বেশি সহায়ক ত্রুটি বার্তায় ত্রুটি ছুঁড়ে দেয়।

যাইহোক, আমি আশা করি আপনি এই পোস্টটি উপভোগ করেছেন এবং এটি গবেষণা করার সময় আমি যতটা শিখেছি তা শিখেছি। উপরের কৌশলগুলি রিয়েল ওয়ার্ল্ড কোডে খুব কমই কার্যকর, তবে হুডের নীচে জিনিসগুলি কীভাবে কাজ করে তা বোঝা এখনও গুরুত্বপূর্ণ যদি আপনার যদি এমন কোনও অস্বাভাবিক ব্যবহারের ক্ষেত্রে থাকে যা কালো যাদুতে পৌঁছানোর প্রয়োজন হয়, বা বরং, আপনি আটকে গেলে আপনি অন্য কারও কালো যাদুতে ডিবাগ করছেন।

পিএস, যদি আমার মতো আপনিও পর্দার নীচে মিডিয়ামের বিশাল অদৃশ্য ব্যানারটি দ্বারা লগ ইন করতে বা ওয়েবসাইটগুলির সাধারণ ড্রাইভে তাদের বিষয়বস্তু পড়া যতটা সম্ভব কঠিন এবং বিরক্তিকর করে তুলতে বিরক্ত হন, আমি কেবল কিল স্টিকিকেই সুপারিশ করতে পারি। এটি একটি সাধারণ জাভাস্ক্রিপ্ট স্নিপেট যা আপনি বুকমার্ক করতে পারেন এবং এটি পৃষ্ঠায় কোনও "স্টিকি" উপাদান মুছে ফেলবে। এটি সহজ শোনায়, তবে কিল স্টিকি সহকারে কাজ করা জীবন পরিবর্তন। এবং যেহেতু এটি কেবল একটি বুকমার্ক, তাই আপনাকে কোনও ইউব্লক ফিল্টারের মতো দুর্ঘটনাক্রমে গুরুত্বপূর্ণ পৃষ্ঠা উপাদানগুলি মুছে ফেলার বিষয়ে আপনার চিন্তা করতে হবে না। সবচেয়ে খারাপ ক্ষেত্রে, আপনি কেবল পৃষ্ঠাটি রিফ্রেশ করতে পারেন।