আমি জাভাস্ক্রিপ্টের পর্দার দৃশ্যের পিছনে বোঝার চেষ্টা করছি এবং অবজেক্টগুলিতে বিশেষত অবজেক্ট এবং ফাংশন এবং তাদের মধ্যে সম্পর্কটি তৈরির বিষয়টি বুঝতে আটকেছি।
এটি জটিল, ভুল বোঝাবুঝি করা সহজ এবং অনেকগুলি শুরুর জাভাস্ক্রিপ্ট বই এটির ভুল হয়ে যায়, তাই আপনি যা পড়েছেন তার উপর বিশ্বাস করবেন না।
১৯৯০-এর দশকে এবং মাইক্রোসফ্টের জেএস ইঞ্জিন প্রয়োগকারীদের মধ্যে আমি একজন এবং মানীকরণ কমিটিতে ছিলাম এবং এই উত্তরটি একসাথে রেখে আমি বেশ কিছু ভুল করেছিলাম। (যদিও আমি 15 বছরেরও বেশি সময় ধরে এটি নিয়ে কাজ করি নি, তবে সম্ভবত আমার ক্ষমা করা যেতে পারে)) এটি কৌশলপূর্ণ বিষয়। তবে একবার আপনি প্রোটোটাইপ উত্তরাধিকার বুঝতে পারলে, এটি সমস্ত অর্থবোধক হয়ে যায়।
যখন আমি পড়লাম যে অ্যারে, স্ট্রিং ইত্যাদির মতো সমস্ত বিল্ট অবজেক্টগুলি অবজেক্ট থেকে এক্সটেনশন (উত্তরাধিকারসূত্রে) হয় তখন আমি ধরে নিয়েছিলাম যে অবজেক্টটি সর্বপ্রথম অবজেক্টে নির্মিত যা তৈরি হয়ে যায় এবং বাকী অবজেক্টগুলি এর উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
শ্রেণিভিত্তিক উত্তরাধিকার সম্পর্কে আপনার জানা সমস্ত কিছু ফেলে দিয়ে শুরু করুন। জেএস প্রোটোটাইপ ভিত্তিক উত্তরাধিকার ব্যবহার করে।
এরপরে, নিশ্চিত করুন যে "উত্তরাধিকার" এর অর্থ কী তা সম্পর্কে আপনার মাথায় খুব স্পষ্ট সংজ্ঞা রয়েছে। সি # বা জাভা বা সি ++ এর মতো ওও ভাষায় ব্যবহৃত লোকেরা ভাবেন যে উত্তরাধিকারের অর্থ সাবটাইপিং, তবে উত্তরাধিকারের অর্থ সাবটাইপিংয়ের অর্থ নয়। উত্তরাধিকার অর্থ একটি জিনিসের সদস্যরাও অন্য জিনিসের সদস্য । এটি অগত্যা এই যে এই জিনিসগুলির মধ্যে একটি subtyping সম্পর্ক আছে মানে না ! টাইপ থিওরিতে এতগুলি ভুল বোঝাবুঝির ফলে লোকেরা বুঝতে পারে না যে পার্থক্য রয়েছে।
তবে আপনি যখন জানতে পারবেন যে অবজেক্টগুলি কেবল ফাংশন দ্বারা তৈরি করা যেতে পারে তবে ফাংশনগুলি ফাংশনের অবজেক্ট ছাড়া কিছুই নয় sense
এটা সহজ মিথ্যা। কিছু ফাংশন কল করে কিছু বস্তু তৈরি হয় না । কিছু কিছু জেএস রানটাইম দ্বারা কিছু তৈরি করার বাইরে তৈরি করা হয়। এমন ডিম রয়েছে যা কোনও মুরগীই রাখেনি । শুরু হওয়ার সাথে সাথে এগুলি কেবল রানটাইম দ্বারা তৈরি হয়েছিল।new FF
আসুন বলুন যে নিয়মগুলি কী এবং সম্ভবত এটি সাহায্য করবে।
- প্রতিটি বস্তুর উদাহরণগুলির একটি প্রোটোটাইপ অবজেক্ট থাকে।
- কিছু ক্ষেত্রে প্রোটোটাইপ হতে পারে
null।
- যদি আপনি কোনও সদস্যের অ্যাক্সেসে কোনও সদস্য অ্যাক্সেস করেন এবং অবজেক্টটিতে সেই সদস্য না থাকে তবে অবজেক্টটি তার প্রোটোটাইপ থেকে পিছিয়ে যায়, বা প্রোটোটাইপ নਾਲ হলে থামিয়ে দেয়।
prototypeএকটি বস্তুর সদস্য সাধারণত হয় না বস্তুর প্রোটোটাইপ।
- বরং
prototypeফাংশন অবজেক্ট এফের সদস্য হ'ল সেই বস্তু যা দ্বারা নির্মিত বস্তুর প্রোটোটাইপ হয়ে যাবে new F()।
- কিছু বাস্তবায়নে উদাহরণগুলি এমন কোনও
__proto__সদস্য পান যা তাদের প্রোটোটাইপ দেয়। (এটি এখন অবচয় করা হয়েছে it এটির উপর নির্ভর করবেন না))
- ফাংশন অবজেক্টস
prototypeযখন তৈরি হয় তখন তাদের ব্র্যান্ড-নতুন ডিফল্ট অবজেক্ট বরাদ্দ করা হয়।
- অবশ্যই কোনও ফাংশন অবজেক্টের প্রোটোটাইপ অবশ্যই
Function.prototype।
আসুন যোগফল দেওয়া যাক।
- প্রোটোটাইপ
Objectহয়Function.prototype
Object.prototype হ'ল অবজেক্ট প্রোটোটাইপ অবজেক্ট।
- প্রোটোটাইপ
Object.prototypeহয়null
- এর প্রোটোটাইপ
Functionহ'ল Function.prototype- এটি এমন বিরল পরিস্থিতিগুলির মধ্যে একটি যেখানে Function.prototypeপ্রকৃতপক্ষে প্রোটোটাইপ Function!
Function.prototype ফাংশন প্রোটোটাইপ অবজেক্ট।
- প্রোটোটাইপ
Function.prototypeহয়Object.prototype
ধরা যাক আমরা একটি ফাংশন ফু তৈরি করি।
- প্রোটোটাইপ
Fooহয় Function.prototype।
Foo.prototype ফু প্রোটোটাইপ অবজেক্ট।
- প্রোটোটাইপ
Foo.prototypeহয় Object.prototype।
ধরা যাক আমরা বলি new Foo()
- নতুন বস্তুর প্রোটোটাইপটি হ'ল
Foo.prototype
তা নিশ্চিত হয়ে নিন। আসুন এটি আঁকুন। ডিম্বাশয় হ'ল বস্তু দৃষ্টান্ত। প্রান্তগুলির __proto__অর্থ হয় "প্রোটোটাইপ" বা prototypeঅর্থ "এর prototypeসম্পত্তি"।

রানটাইম যা করতে হবে তা হ'ল সেই সমস্ত অবজেক্ট তৈরি করা এবং সেই অনুসারে তাদের বিভিন্ন বৈশিষ্ট্য নির্ধারণ করা। আমি নিশ্চিত আপনি কীভাবে এটি সম্পন্ন হবে তা দেখতে পারবেন।
এখন আসুন এমন একটি উদাহরণ দেখুন যা আপনার জ্ঞান পরীক্ষা করে।
function Car(){ }
var honda = new Car();
print(honda instanceof Car);
print(honda.constructor == Car);
এই মুদ্রণ কি?
আচ্ছা, instanceofমানে কি? honda instanceof Carমানে " এর প্রোটোটাইপ চেইনে Car.prototypeকোনও বস্তুর সমান honda?"
হ্যাঁ তাই হয়। hondaএর প্রোটোটাইপ হ'ল Car.prototype, তাই আমরা শেষ করেছি। এই সত্য প্রিন্ট।
দ্বিতীয়টির কী হবে?
honda.constructorঅস্তিত্ব নেই তাই আমরা প্রোটোটাইপের সাথে পরামর্শ করি, যা Car.prototype। যখন Car.prototypeবস্তুটি তৈরি করা হয়েছিল তখন এটি স্বয়ংক্রিয়ভাবে constructorসমান সম্পত্তি দেওয়া হয়েছিল Car, সুতরাং এটি সত্য।
এখন এই কি?
var Animal = new Object();
function Reptile(){ }
Reptile.prototype = Animal;
var lizard = new Reptile();
print(lizard instanceof Reptile);
print(lizard.constructor == Reptile);
এই প্রোগ্রামটি কী মুদ্রণ করে?
আবার, এর lizard instanceof Reptileঅর্থ " এর প্রোটোটাইপ চেইনে Reptile.prototypeকোনও বস্তুর সমান lizard?"
হ্যাঁ তাই হয়। lizardএর প্রোটোটাইপ হ'ল Reptile.prototype, তাই আমরা শেষ করেছি। এই সত্য প্রিন্ট।
এখন, কি সম্পর্কে
print(lizard.constructor == Reptile);
আপনি মনে করতে পারেন যে এটি সত্যও প্রিন্ট করে, যেহেতু lizardএটি নির্মিত হয়েছিল new Reptileতবে আপনি ভুল হবেন। এটি যুক্তিযুক্ত।
- না
lizardএকটি আছে constructorসম্পত্তি? না। সুতরাং আমরা প্রোটোটাইপ তাকান।
- এর প্রোটোটাইপ
lizardহয় Reptile.prototypeযা, Animal।
- না
Animalএকটি আছে constructorসম্পত্তি? না। সুতরাং আমরা এটি প্রোটোটাইপ তাকান।
- এর প্রোটোটাইপ
Animalহ'ল Object.prototype, এবং Object.prototype.constructorএটি রানটাইম দ্বারা তৈরি এবং সমান Object।
- সুতরাং এই প্রিন্ট মিথ্যা।
আমাদের Reptile.prototype.constructor = Reptile;সেখানে কিছু সময় বলা উচিত ছিল, কিন্তু আমাদের মনে নেই!
নিশ্চিত হয়ে নিন যে সবগুলি আপনার কাছে বোধগম্য। এটি এখনও বিভ্রান্তিকর হলে কিছু বাক্স এবং তীর আঁকুন।
অন্যান্য অত্যন্ত বিভ্রান্তিকর জিনিসটি হ'ল, যদি আমি console.log(Function.prototype)এটি কোনও ফাংশন প্রিন্ট করি তবে যখন আমি console.log(Object.prototype)এটি প্রিন্ট করি তখন কোনও বস্তু মুদ্রিত হয়। কেন Function.prototypeএকটি ফাংশন যখন এটি একটি বস্তু বোঝানো হয়েছিল?
ফাংশন প্রোটোটাইপ একটি ফাংশন হিসাবে সংজ্ঞায়িত করা হয় যা ডাকা হলে ফিরে আসে undefined। আমরা ইতিমধ্যে জানি যে Function.prototypeহয় Functionপ্রোটোটাইপ, আশ্চর্যের ব্যাপার যে। সুতরাং Function.prototype()আইনসম্মত, এবং যখন আপনি এটি করেন, আপনি undefinedফিরে পাবেন। সুতরাং এটি একটি ফাংশন।
Objectপ্রোটোটাইপ এই সম্পত্তি নেই; এটি কলযোগ্য নয়। এটা ঠিক একটি বিষয়।
যখন আপনি console.log(Function.prototype.constructor)এটি আবার একটি ফাংশন।
Function.prototype.constructorঠিক Function, স্পষ্টতই। এবং Functionএকটি ফাংশন।
এখন আপনি কীভাবে এটি তৈরি করতে কিছু ব্যবহার করতে পারেন (মন = ফুঁকানো)।
আপনি এটি অতিরিক্ত চিন্তা করছেন । যা যা প্রয়োজন তা হ'ল রানটাইম শুরু হওয়ার সাথে সাথে একগুচ্ছ অবজেক্ট তৈরি করে। অবজেক্টস কেবল সারণী যা অবজেক্টগুলির সাথে স্ট্রিংগুলিকে যুক্ত করে are যখন রানটাইম শুরুর, সব কি আছে কয়েক ডজন ফাঁকা বস্তু তৈরি করুন এবং তারপর বরাদ্দ শুরু prototype, __proto__, constructor, এবং তাই প্রতিটি বস্তুর বৈশিষ্ট্যাবলী উপর যতক্ষণ না তারা গ্রাফ যে, তারা করতে হবে না।
আপনি যে চিত্রটি উপরে আমি দিয়েছি তা যদি আপনি গ্রহণ করেন এবং constructorএটিতে প্রান্তগুলি যুক্ত করেন তবে এটি সহায়ক হবে। আপনি তাড়াতাড়ি দেখতে পাবেন যে এটি একটি খুব সাধারণ অবজেক্ট গ্রাফ এবং রানটাইমটি তৈরি করতে কোনও সমস্যা হবে না।
একটি ভাল অনুশীলন এটি নিজেই করা হবে। এখানে, আমি আপনাকে শুরু করব। আমরা my__proto__"প্রোটোটাইপ অবজেক্ট" এবং myprototype"প্রোটোটাইপ সম্পত্তি " এর অর্থ ব্যবহার করব ।
var myobjectprototype = new Object();
var myfunctionprototype = new Object();
myfunctionprototype.my__proto__ = myobjectprototype;
var myobject = new Object();
myobject.myprototype = myobjectprototype;
ইত্যাদি। "বাস্তব" জাভাস্ক্রিপ্ট অন্তর্নির্মিত অবজেক্টের মতো একই টপোলজি রয়েছে এমন একটি সামগ্রীর জন্য আপনি কী এই প্রোগ্রামটির বাকী অংশটি পূরণ করতে পারেন? আপনি যদি এটি করেন তবে আপনি এটি খুঁজে পাওয়া অত্যন্ত সহজ।
জাভাস্ক্রিপ্টের অবজেক্টগুলি কেবলমাত্র সারণী যা অন্য বস্তুর সাথে স্ট্রিংগুলিকে সংযুক্ত করে । এটাই! এখানে কোন যাদু নেই। আপনি নিজেকে গিঁটে আবদ্ধ করছেন কারণ আপনি এমন প্রতিবন্ধকতাগুলি কল্পনা করছেন যা বাস্তবে অস্তিত্ব নেই, যেমন প্রতিটি বস্তু একজন কনস্ট্রাক্টর দ্বারা তৈরি করতে হয়েছিল।
ফাংশনগুলি কেবলমাত্র এমন বস্তু যাগুলির একটি অতিরিক্ত ক্ষমতা রয়েছে: বলা যেতে পারে। সুতরাং আপনার সামান্য সিমুলেশন প্রোগ্রামটি দেখুন এবং .mycallableপ্রতিটি বস্তুর সাথে একটি সম্পত্তি যুক্ত করুন যা এটি কলযোগ্য কিনা তা নির্দেশ করে। এটা ঐটার মতই সহজ.
Function.prototypeএটি একটি ফাংশন হতে পারে এবং এর অভ্যন্তরীণ ক্ষেত্র থাকতে পারে। সুতরাং না আপনি যখন প্রোটোটাইপ ফাংশনটি কাঠামোর মধ্য দিয়ে যাচ্ছেন তখন চালাবেন না। পরিশেষে মনে রাখবেন যে একটি ইঞ্জিন জাভাস্ক্রিপ্টকে ব্যাখ্যা করার মতো রয়েছে, সুতরাং অবজেক্ট এবং ফাংশন সম্ভবত ইঞ্জিনের মধ্যে তৈরি হয়েছে, জাভাস্ক্রিপ্ট থেকে নয় এবং বিশেষ রেফারেন্স থেকেFunction.prototypeএবংObject.prototypeসম্ভবত ইঞ্জিন দ্বারা একটি বিশেষ উপায়ে ব্যাখ্যা করা যেতে পারে।