এটি একটি খুব সাধারণ প্রোটোটাইপ ভিত্তিক অবজেক্ট মডেল যা ব্যাখ্যার সময় একটি নমুনা হিসাবে বিবেচিত হবে, কোনও মন্তব্য ছাড়াই:
function Person(name){
this.name = name;
}
Person.prototype.getName = function(){
console.log(this.name);
}
var person = new Person("George");
প্রোটোটাইপ ধারণার মধ্য দিয়ে যাওয়ার আগে আমাদের কয়েকটি গুরুত্বপূর্ণ বিষয় বিবেচনা করতে হবে।
1- জাভাস্ক্রিপ্ট কার্যত কীভাবে কাজ করে:
প্রথম পদক্ষেপ নিতে হলে আমাদের কীভাবে জাভাস্ক্রিপ্ট ফাংশন কাজ করে তা this
কীওয়ার্ড ব্যবহার করে ফাংশনের মতো শ্রেণি হিসাবে বা তার যুক্তিগুলির সাথে একটি নিয়মিত ফাংশন হিসাবে, এটি কী করে এবং কী ফিরে আসে তা নির্ধারণ করতে হবে।
ধরা যাক আমরা একটি Person
অবজেক্ট মডেল তৈরি করতে চাই । তবে এই পদক্ষেপে আমি ব্যবহার না করে একই সঠিক জিনিসটি করার চেষ্টা করবprototype
new
শব্দটি এবং কীওয়ার্ড না দিয়ে ।
সুতরাং এই পদক্ষেপে functions
, objects
এবংthis
শব্দ, সব আমরা আছে।
প্রথম প্রশ্নটি কীওয়ার্ডটি ব্যবহার না করে কীভাবে কার্যকর this
হতে পারেnew
শব্দ ।
সুতরাং এর উত্তরের জন্য বলি যে আমাদের একটি খালি অবজেক্ট রয়েছে এবং দুটি ফাংশন যেমন:
var person = {};
function Person(name){ this.name = name; }
function getName(){
console.log(this.name);
}
এবং এখন ব্যবহার না করেnew
কীওয়ার্ড আমরা কীভাবে এই ফাংশনগুলি ব্যবহার করতে পারি। সুতরাং জাভাস্ক্রিপ্ট এর 3 টি বিভিন্ন উপায় আছে:
ক। প্রথম উপায়টি হ'ল ফাংশনটিকে একটি নিয়মিত ফাংশন হিসাবে ডাকা:
Person("George");
getName();//would print the "George" in the console
এক্ষেত্রে এটি বর্তমান কনটেক্সট অবজেক্ট হবে যা সাধারণত window
ব্রাউজারে বা এর GLOBAL
মধ্যে বৈশ্বিক অবজেক্ট Node.js
। এর অর্থ আমাদের ব্রাউজারে উইন্ডো.নাম বা নোড.জেজে GLOBAL.name, "জর্জ" এর মান হিসাবে থাকবে।
খ। আমরা তাদের কোনও বস্তুর সাথে এর বৈশিষ্ট্য হিসাবে সংযুক্ত করতে পারি
- এটি করার সহজতম উপায় হ'ল খালি person
বস্তুটি সংশোধন করা , যেমন:
person.Person = Person;
person.getName = getName;
এইভাবে আমরা তাদের যেমন কল করতে পারি:
person.Person("George");
person.getName();// -->"George"
এবং এখন person
অবজেক্টটি এর মতো:
Object {Person: function, getName: function, name: "George"}
- কোনও বস্তুর সাথে সম্পত্তি যুক্ত করার অন্য উপায়টি হ'ল সেই অবজেক্টটির নাম ব্যবহার করে prototype
যা কোনও জাভাস্ক্রিপ্ট অবজেক্টের নামের সাথে পাওয়া যেতে পারে __proto__
এবং আমি সারাংশ অংশে এটি কিছুটা ব্যাখ্যা করার চেষ্টা করেছি। সুতরাং আমরা একইভাবে একই ফলাফল পেতে পারি:
person.__proto__.Person = Person;
person.__proto__.getName = getName;
তবে এইভাবে আমরা আসলে যা করছি তা হ'ল সংশোধন করা Object.prototype
, কারণ আমরা যখনই জাভাস্ক্রিপ্ট অবজেক্টটি আক্ষরিক ( { ... }
) ব্যবহার করে তৈরি করি তখন এটি এর ভিত্তিতে তৈরি হয় Object.prototype
, যার অর্থ এটি নতুনভাবে তৈরি হওয়া বস্তুর সাথে যুক্ত বৈশিষ্ট্য হিসাবে যুক্ত হয় __proto__
, তাই আমরা যদি এটি পরিবর্তন করি তবে যেমনটি আমরা আমাদের আগের কোড স্নিপেটে করেছিলাম, সমস্ত জাভাস্ক্রিপ্ট অবজেক্ট বদলে যাবে, একটি ভাল অনুশীলন নয়। সুতরাং এখন এর চেয়ে ভাল অনুশীলন আর কী হতে পারে:
person.__proto__ = {
Person: Person,
getName: getName
};
এবং এখন অন্যান্য বস্তুগুলি শান্তিতে রয়েছে তবে এটি এখনও একটি ভাল অনুশীলন বলে মনে হয় না। সুতরাং আমাদের কাছে আরও একটি সমাধান রয়েছে তবে এই সমাধানটি ব্যবহার করার জন্য আমাদের সেই কোডের লাইনে ফিরে আসা উচিত যেখানে person
বস্তুটি তৈরি হয়েছিল ( var person = {};
) তারপরে এটিকে পরিবর্তন করুন:
var propertiesObject = {
Person: Person,
getName: getName
};
var person = Object.create(propertiesObject);
এটি কী একটি নতুন জাভাস্ক্রিপ্ট তৈরি করছে Object
এবং সংযুক্ত propertiesObject
করতে __proto__
অ্যাট্রিবিউট। সুতরাং আপনি নিশ্চিত করতে পারেন যে:
console.log(person.__proto__===propertiesObject); //true
তবে এখানে জটিল বিষয়টি হ'ল আপনার কাছে অবজেক্টের __proto__
প্রথম স্তরে সংজ্ঞায়িত সমস্ত বৈশিষ্ট্যে অ্যাক্সেস রয়েছে person
(আরও বিশদ জন্য সংক্ষিপ্ত অংশটি পড়ুন)।
যেহেতু আপনি দেখতে পাচ্ছেন যে এই দুটি উপায়ে this
যে কোনও একটিই ব্যবহার করা person
অবজেক্টের সাথে হুবহু নির্দেশ করবে ।
গ। জাভাস্ক্রিপ্টের সাথে ফাংশনটি দেওয়ার আরও একটি উপায় রয়েছে this
, যা কলটি ব্যবহার করে বা ফাংশনটি শুরু করতে প্রয়োগ করে।
প্রয়োগ () পদ্ধতিটি একটি প্রদত্ত এই মান এবং একটি অ্যারের (বা একটি অ্যারের মতো অবজেক্ট) হিসাবে সরবরাহিত আর্গুমেন্টগুলির সাথে একটি ফাংশনকে কল করে।
এবং
কল () পদ্ধতিটি পৃথকভাবে প্রদত্ত এই মান এবং যুক্তিগুলির সাথে একটি ফাংশনকে কল করে।
এইভাবে যা আমার প্রিয়, আমরা আমাদের ফাংশনগুলিতে সহজেই কল করতে পারি:
Person.call(person, "George");
অথবা
//apply is more useful when params count is not fixed
Person.apply(person, ["George"]);
getName.call(person);
getName.apply(person);
এই 3 টি পদ্ধতি .প্রোটোটাইপ কার্যকারিতা নির্ধারণের জন্য গুরুত্বপূর্ণ প্রাথমিক পদক্ষেপ।
2- কিভাবে new
কীওয়ার্ডটি কাজ করে?
.prototype
কার্যকারিতা বোঝার জন্য এটি দ্বিতীয় পদক্ষেপ th প্রক্রিয়াটি অনুকরণ করার জন্য এটিই আমি ব্যবহার করি:
function Person(name){ this.name = name; }
my_person_prototype = { getName: function(){ console.log(this.name); } };
এই অংশে আমি ব্যবহার না করে, সমস্ত ধাপ যা JavaScript লাগে নেওয়া করার চেষ্টা করতে আছি new
শব্দ এবং prototype
যখন আপনি ব্যবহার new
keyword। সুতরাং যখন আমরা নাnew Person("George")
, Person
ফাংশনটি কনস্ট্রাক্টর হিসাবে কাজ করে, এটি জাভাস্ক্রিপ্ট যা করে এক এক করে:
ক। প্রথমত এটি একটি খালি বস্তু তোলে, মূলত একটি খালি হ্যাশ:
var newObject = {};
খ। জাভাস্ক্রিপ্ট পরবর্তী পদক্ষেপটি হল নতুন নির্মিত বস্তুর সাথে সমস্ত প্রোটোটাইপ অবজেক্ট সংযুক্ত করা
আমাদের my_person_prototype
এখানে প্রোটোটাইপ অবজেক্টের মতোই রয়েছে।
for(var key in my_person_prototype){
newObject[key] = my_person_prototype[key];
}
এটি যেভাবে জাভাস্ক্রিপ্ট প্রোটোটাইপে সংজ্ঞায়িত বৈশিষ্ট্যগুলিকে সংযুক্ত করে সেভাবে নয়। আসল উপায় প্রোটোটাইপ চেইন ধারণার সাথে সম্পর্কিত।
ক। & খ। এই দুটি পদক্ষেপের পরিবর্তে আপনি ঠিক একই ফলাফল করতে পারবেন:
var newObject = Object.create(my_person_prototype);
//here you can check out the __proto__ attribute
console.log(newObject.__proto__ === my_person_prototype); //true
//and also check if you have access to your desired properties
console.log(typeof newObject.getName);//"function"
এখন আমরা getName
আমাদের মধ্যে ফাংশন কল করতে পারেন my_person_prototype
:
newObject.getName();
গ। তারপরে এটি সেই বস্তুটি নির্মাণকারীকে দেয়,
আমরা আমাদের নমুনা দিয়ে এটি করতে পারি:
Person.call(newObject, "George");
অথবা
Person.apply(newObject, ["George"]);
তারপরে কনস্ট্রাক্টর যা খুশি তাই করতে পারে, কারণ এই কনস্ট্রাক্টরের ভিতরে এটি তৈরি করা বস্তু created
অন্যান্য পদক্ষেপের অনুকরণের আগে এখন শেষ ফলাফল: অবজেক্ট {নাম: "জর্জ"}
সারসংক্ষেপ:
মূলত, আপনি যখন কোনও ফাংশনে নতুন কীওয়ার্ডটি ব্যবহার করেন , আপনি সেই দিকে কল করে যাচ্ছেন এবং সেই ফাংশনটি একজন কনস্ট্রাক্টর হিসাবে কাজ করে, তাই যখন আপনি বলেন:
new FunctionName()
জাভাস্ক্রিপ্ট অভ্যন্তরীণভাবে একটি অবজেক্ট তৈরি করে, একটি খালি হ্যাশ এবং তারপরে এটি নির্ধারককে সেই বস্তু দেয়, তবে কনস্ট্রাক্টর যা ইচ্ছা তা করতে পারে, কারণ এই কনস্ট্রাক্টরের অভ্যন্তরীণটি কেবলমাত্র তৈরি করা বস্তু এবং তারপরে এটি আপনাকে অবশ্যই সেই অবজেক্ট দেয় আপনি যদি আপনার ফাংশনে রিটার্নের বিবৃতি ব্যবহার না করেন বা return undefined;
আপনার ফাংশন বডিটির শেষে রেখে দেন।
সুতরাং যখন জাভাস্ক্রিপ্ট কোনও বস্তুর উপর একটি সম্পত্তি অনুসন্ধান করতে যায়, প্রথম জিনিসটি এটি করে, এটি কি সেই অবজেক্টটিতে এটি দেখায়। এবং তারপরে একটি গোপন সম্পত্তি রয়েছে [[prototype]]
যা আমাদের সাধারণত এটির মতো থাকে __proto__
এবং সেই সম্পত্তিটি জাভাস্ক্রিপ্টের পরের দিকে দেখায়। এবং যখন এটি এর মাধ্যমে দেখা যায় __proto__
, যতদূর এটি আবার অন্য জাভাস্ক্রিপ্ট অবজেক্ট, এটির নিজস্ব __proto__
বৈশিষ্ট্য রয়েছে, এটি উপরে এবং উপরে চলে যায় যতক্ষণ না এটি পরেরটি __proto__
শূন্য হয়। জাভাস্ক্রিপ্টে বিন্দুটি হ'ল একমাত্র বস্তু যা এর __proto__
বৈশিষ্ট্যটি নাল হ'ল Object.prototype
বস্তু:
console.log(Object.prototype.__proto__===null);//true
এবং এটি জাভাস্ক্রিপ্টে উত্তরাধিকার কাজ করে।
অন্য কথায়, যখন কোনও ফাংশনে আপনার প্রোটোটাইপ সম্পত্তি থাকে এবং আপনি যখন নতুন কোনও কল করেন তখন জাভাস্ক্রিপ্টের দ্বারা নতুন নতুন তৈরি হওয়া সামগ্রীর দিকে তাকানো শেষ হয়ে যায়, এটি ফাংশনটির দিকে তাকাবে .prototype
এবং এটিও সম্ভব যে এই বস্তুটির এটি রয়েছে নিজস্ব অভ্যন্তরীণ প্রোটোটাইপ। ইত্যাদি।