প্রোটোটাইপগুলি একটি অপ্টিমাইজেশন ।
এগুলিকে ভালভাবে ব্যবহার করার একটি দুর্দান্ত উদাহরণ হ'ল jQuery লাইব্রেরি। যতবারই আপনি ব্যবহার করে কোনও jQuery অবজেক্ট পান $('.someClass')
, সেই বস্তুর কয়েক ডজন "পদ্ধতি" রয়েছে। গ্রন্থাগারটি কোনও বস্তু ফিরিয়ে দিয়ে তা অর্জন করতে পারে:
return {
show: function() { ... },
hide: function() { ... },
css: function() { ... },
animate: function() { ... },
};
তবে এর অর্থ হ'ল মেমোরিতে প্রতিটি jQuery অবজেক্টের কয়েক ডজন নামযুক্ত স্লট একই পদ্ধতিতে থাকবে এবং এটি বারবার থাকবে।
পরিবর্তে, সেই পদ্ধতিগুলি একটি প্রোটোটাইপ এবং সমস্ত jQuery অবজেক্টগুলিতে "উত্তরাধিকারসূত্রে" সংজ্ঞায়িত হয় যাতে প্রোটোটাইপ যাতে খুব অল্প রানটাইম ব্যয়ে এই সমস্ত পদ্ধতি অর্জন করতে পারে।
JQuery এটি ঠিক কীভাবে পায় তার একটি অতি গুরুত্বপূর্ণ অংশ হ'ল এটি প্রোগ্রামার থেকে লুকানো। এটি নিখুঁতভাবে একটি অপ্টিমাইজেশন হিসাবে বিবেচনা করা হয়, লাইব্রেরিটি ব্যবহার করার সময় আপনার যে উদ্বেগের দরকার তা নয়।
জাভাস্ক্রিপ্টের সমস্যাটি হ'ল নগ্ন কন্সট্রাক্টর ফাংশনগুলির জন্য কলারটিকে তাদের উপসর্গের সাথে স্মরণ করা প্রয়োজন new
বা অন্যথায় তারা সাধারণত কাজ করে না। এর কোনও ভাল কারণ নেই। jQuery ঠিক কোনও সাধারণ ক্রিয়াকলাপের পিছনে সেই আজেবাজে কথাটি লুকিয়ে রাখে $
, সুতরাং আপনাকে কীভাবে অবজেক্টগুলি বাস্তবায়ন করা হয় তা যত্ন নেওয়ার দরকার নেই।
যাতে আপনি কোনও নির্দিষ্ট প্রোটোটাইপ দিয়ে সুবিধার্থে কোনও অবজেক্ট তৈরি করতে পারেন, ইসমাএসক্রিপ 5 এ একটি মানক ফাংশন অন্তর্ভুক্ত রয়েছে Object.create
। এর একটি বিস্তৃত সরলীকৃত সংস্করণ এর মতো দেখতে পাবেন:
Object.create = function(prototype) {
var Type = function () {};
Type.prototype = prototype;
return new Type();
};
এটি কেবল কোনও কনস্ট্রাক্টর ফাংশন লেখার এবং তারপরে কল করার ব্যথার যত্ন নেয় new
।
আপনি কখন প্রোটোটাইপগুলি এড়াবেন?
একটি দরকারী তুলনা হ'ল জাভা এবং সি # এর মতো জনপ্রিয় ওও ভাষার সাথে। এগুলি দুই ধরণের উত্তরাধিকারকে সমর্থন করে:
- ইন্টারফেস উত্তরাধিকার, যেখানে আপনি
implement
একটি interface
যেমন বর্গ ইন্টারফেসের যে সদস্যের নিজস্ব অনন্য বাস্তবায়ন উপলব্ধ পারে।
- বাস্তবায়ন উত্তরাধিকার, যেখানে আপনি
extend
একটি class
যে কিছু পদ্ধতি ডিফল্ট বাস্তবায়নের প্রদান করে।
জাভাস্ক্রিপ্টে, প্রোটোটাইপিকাল উত্তরাধিকার এক ধরণের বাস্তবায়ন উত্তরাধিকার। সুতরাং সেই পরিস্থিতিতে যেখানে (সি # বা জাভাতে) আপনি ডিফল্ট আচরণ অর্জনের জন্য বেস ক্লাস থেকে উদ্ভূত হয়েছিলেন, যা আপনি এরপরে ওভাররাইডের মাধ্যমে ছোট ছোট পরিবর্তনগুলি করেন, তারপরে জাভাস্ক্রিপ্টে, প্রোটোটাইপিকাল উত্তরাধিকারটি বোঝায়।
তবে আপনি যদি এমন কোনও পরিস্থিতিতে থাকেন যেখানে আপনি সি # বা জাভাতে ইন্টারফেস ব্যবহার করেছেন তবে জাভাস্ক্রিপ্টে আপনার কোনও বিশেষ ভাষা বৈশিষ্ট্যের প্রয়োজন নেই। ইন্টারফেসের প্রতিনিধিত্ব করে এমন কোনও কিছু স্পষ্টভাবে ঘোষণা করার দরকার নেই এবং বস্তুগুলিকে সেই ইন্টারফেসটিকে "বাস্তবায়ন" হিসাবে চিহ্নিত করার দরকার নেই:
var duck = {
quack: function() { ... }
};
duck.quack();
অন্য কথায়, যদি প্রতিটি "ধরণের" অবজেক্টের "পদ্ধতি" এর নিজস্ব সংজ্ঞা থাকে, তবে প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে কোনও মূল্য নেই। এর পরে, আপনি প্রতিটি প্রকারের জন্য কতটা উদাহরণ বরাদ্দ করেন তা নির্ভর করে। তবে অনেকগুলি মডুলার ডিজাইনে প্রদত্ত প্রকারের কেবলমাত্র একটি উদাহরণ রয়েছে।
এবং প্রকৃতপক্ষে, এটি বহু লোক দ্বারা পরামর্শ দিয়েছে যে বাস্তবায়নের উত্তরাধিকারটি মন্দ । এটি হ'ল, যদি কোনও ধরণের জন্য কিছু সাধারণ ক্রিয়াকলাপ হয়, তবে সম্ভবত এটি পরিষ্কার হয় যদি সেগুলি বেস / সুপার শ্রেণিতে স্থাপন না করা হয় তবে পরিবর্তে কিছু মডিউলে সাধারণ ফাংশন হিসাবে প্রকাশ করা হয়, যেখানে আপনি অবজেক্ট (গুলি) পাস করেন to আপনি তাদের চালিত করতে চান।