কনস্ট্রাক্টর.প্রোটোটাইপ থেকে কীভাবে __প্রোটো__ পার্থক্য করতে পারে?


163
function Gadget(name, color)
{
   this.name = name;
   this.color = color;
}

Gadget.prototype.rating = 3

var newtoy = new Gadget("webcam", "black")

newtoy.constructor.prototype.constructor.prototype.constructor.prototype 

এটি সর্বদা রেটিং = 3 দিয়ে বস্তুটি ফেরত দেয়।

তবে আমি যদি নিম্নলিখিতগুলি করি:

newtoy.__proto__.__proto__.__proto__

চেইন শেষ হয়ে শেষ null

এছাড়াও ইন্টারনেট এক্সপ্লোরারে কোনও __proto__সম্পত্তি না থাকলে আমি কীভাবে নালটি পরীক্ষা করব ?


30
এই গ্রাফ চিত্রটি আপনাকে প্রোটোটাইপ এবং প্রোটোর মধ্যে পার্থক্য বুঝতে সহায়তা করবে । আপনি newtoy অবজেক্ট থেকে প্রোটো চেইন অনুসরণ করতে পারেন , এবং তারপরে আপনি বুঝতে পারবেন কেন newtoy থেকে 3 য় প্রোটো বাতিল হয়।
বিট করুন

এছাড়াও চিত্রটি থেকে এটি পরিষ্কার যে newtoy.prototypeসমান নয় newtoy.constructor.prototypeএবং তাই newtoy.constructor.prototypeসম্পত্তি হিসাবে ডাকা হবে না rating। একইভাবে newtoy.constructor.prototype.constructor.propertyসম্পত্তি হিসাবে ডাকা হবে না rating
বিট

সর্বশেষ মন্তব্যে টাইপ করুন: সুতরাং newtoy.constructor.prototypeরেটিং নামক সম্পত্তি থাকবে। একইভাবে newtoy.constructor.prototype.constructor.propertyরেটিং নামক সম্পত্তিও থাকবে।
বিট


1
@ রই নমির আমি গিথুবে জেএসভিজ আপলোড করেছি । এখানে ডেমো সাইট রয়েছে । আসল কোডটি কতটা অপ্রকাশিত (এবং নোংরা) তা দয়া করে কিছু মনে করবেন না। এটির অতি পুরানো প্রকল্প যা আমি চিরকালের জন্য স্পর্শ করি নি।
বিট

উত্তর:


210

আমি সম্প্রতি এই সম্পর্কে আমার মাথা গুটিয়ে দেওয়ার চেষ্টা করেছি এবং অবশেষে এই "মানচিত্র" নিয়ে এসেছি যা আমি মনে করি যে বিষয়টি পুরোপুরি আলোকপাত করেছে

http://i.stack.imgur.com/KFzI3.png এখানে চিত্র বর্ণনা লিখুন

আমি জানি আমি এটি তৈরির প্রথম ব্যক্তি নই তবে এটি খুঁজে পাওয়া যে এটি খুঁজে পেয়েছে এটি আরও আকর্ষণীয় ছিল :-)। যাইহোক, এর পরে আমি উদাহরণস্বরূপ এটি অন্য একটি চিত্র খুঁজে পেয়েছি যা আমি মনে করি মূলত একই বলে:

জাভাস্ক্রিপ্ট অবজেক্ট লেআউট

আমার জন্য সবচেয়ে আশ্চর্যজনক বিষয়টি তার পরিবর্তে সেই Object.__proto__পয়েন্টগুলি আবিষ্কার করছিল , তবে আমি নিশ্চিত যে এর জন্য একটি ভাল কারণ রয়েছে :-)Function.prototypeObject.prototype

আমি এখানে চিত্রটিতে উল্লিখিত কোডটিও পাশাপাশি আটকান যদি কেউ এটির পরীক্ষা করতে চায়। নোট করুন যে কিছু সংখ্যার লাফ দেওয়ার পরে আমরা কোথায় আছি তা সহজেই জানার জন্য কিছু সম্পত্তি যুক্ত করা হয়েছে:

Object.O1='';
Object.prototype.Op1='';

Function.F1 = '';
Function.prototype.Fp1 = '';

Cat = function(){};
Cat.C1 = '';
Cat.prototype.Cp1 = '';

mycat = new Cat();
o = {};

// EDITED: using console.dir now instead of console.log
console.dir(mycat);
console.dir(o);

2
পছন্দ করুন ওপি পোস্ট করেছে এমন কোডের অন্য গ্রাফিকাল উপস্থাপনা চেকআউট করুন । এবং আমি মনে করি আমাদের চিত্রগুলি প্রযুক্তিগত বিশদগুলির সাথে একমত।
বিটস

43
যে দিকে Object.__proto__ইঙ্গিত করার কারণ তা Function.prototypeহ'ল Object()নিজে থেকে একটি দেশীয় ফাংশন যা একটি খালি বস্তুকে ইনস্ট্যান্ট করে। সুতরাং, Object()একটি ফাংশন। আপনি দেখতে পাবেন যে অন্যান্য সমস্ত প্রধান দেশীয় প্রকারের __proto__বৈশিষ্ট্যগুলি নির্দেশ করে Function.prototypeObject, Function, String, Number, এবং Arrayসব ফাংশন প্রোটোটাইপ উত্তরাধিকারী।
সুইভেল

@drodsou আপনার দ্বিতীয় লিঙ্কটি দুর্দান্ত। দয়া করে এখনই এটি পরীক্ষা করে দেখুন;) মলিপেজ.অর্গ / মিস / js.mp সুন্দর ব্যাখ্যা: ডি
অভিসেকপি

@ সুইভেল "অতএব, অবজেক্ট () একটি ফাংশন" - আপনি কি অবজেক্টকে একটি ফাংশন বলতে চান? () ছাড়াই
জিওরজিম

2
পছন্দ করুন Objectনিজেই একটি ফাংশন; কলযোগ্য কার্যকর করার ফলাফল Object(অর্থাত্, চলমান ফেরতের মান Object()) কোনও ফাংশন নয়।
সুইভেল

67

constructorকোনও পূর্বনির্ধারিত [[DontEnum]] বস্তুটির prototypeবৈশিষ্ট্য যা কোনও ফাংশন অবজেক্টের সম্পত্তি দ্বারা নির্দেশিত এবং এটি প্রাথমিকভাবে ফাংশন অবজেক্টের দিকে নির্দেশ করবে।

__proto__ এটি কোনও বস্তুর অভ্যন্তরীণ [[প্রোটোটাইপ]] এর সমপরিমাণ, যেমন এর প্রকৃত প্রোটোটাইপ।

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

এর অর্থ এটি নির্ধারিত .constructorহবে .__proto__.constructor, অর্থাৎ বস্তুটি তৈরি করতে ব্যবহৃত কনস্ট্রাক্টর ফাংশন এবং আমরা যেমন শিখেছি, protoypeএই ফাংশনের সম্পত্তিটি বস্তুর [[প্রোটোটাইপ]] সেট করতে ব্যবহৃত হত।

এটি অনুসরণ করে .constructor.prototype.constructorযা অভিন্ন .constructor(যতক্ষণ না এই বৈশিষ্ট্যগুলি ওভাররাইট করা হয়নি); দেখতে এখানে আরো বিস্তারিত ব্যাখ্যার জন্য।

যদি __proto__উপলভ্য থাকে তবে আপনি অবজেক্টের প্রকৃত প্রোটোটাইপ চেইনটি হাঁটতে পারেন। সরল ECMAScript3 এ করার কোনও উপায় নেই কারণ জাভাস্ক্রিপ্ট গভীর উত্তরাধিকারের স্তরক্রমের জন্য ডিজাইন করা হয়নি।


3
সেই 'এখানে' লিঙ্কটি সোনার মান। আপনি যদি সম্পূর্ণ বিবরণ চান সেখানে যান।
রিক্সালিন

.constructor.prototypeচেইন দিয়ে ভাল লাগছে catch আমিও আমার পক্ষে অস্পষ্ট ছিলাম, যদিও আমি দেখিনি যে .constructorএটি সমান .__proto__.constructor। যার অর্থ কেবল কনস্ট্রাক্টর ফাংশন এবং এটির প্রোটোটাইপের মধ্যে সাইকেল চালানো।
জনি_ডি

30

জাভাস্ক্রিপ্টে প্রোটোটাইপাল হেরিরিয়েন্স এমন __proto__এক অর্থে সম্পত্তিটির উপর ভিত্তি করে তৈরি করা হয়েছে যে প্রতিটি বস্তু তার __proto__সম্পত্তি দ্বারা রেফারেন্সযুক্ত সামগ্রীর বিষয়বস্তু উত্তরাধিকার সূত্রে প্রাপ্ত হয় ।

prototypeসম্পত্তি শুধুমাত্র বিশেষ Functionবস্তু এবং শুধুমাত্র ব্যবহার যখন newঅপারেটর একটি কল করতে Functionকন্সট্রাকটর হিসাবে। এই ক্ষেত্রে, তৈরি করা অবজেক্টস __proto__কনস্ট্রাক্টরের সেট করা হবে Function.prototype

এর অর্থ হ'ল যুক্ত করা যা Function.prototypeসমস্ত বিষয়গুলিতে স্বয়ংক্রিয়ভাবে প্রতিফলিত হবে যার __proto__রেফারেন্স দিচ্ছে Function.prototype

কনস্ট্রাক্টরকে Function.prototypeঅন্য কোনও অবজেক্টের সাথে প্রতিস্থাপন করা ইতিমধ্যে বিদ্যমান বস্তুর কোনওটির জন্য সম্পত্তি আপডেট করবে না__proto__

নোট করুন যে __proto__সম্পত্তিটিতে সরাসরি অ্যাক্সেস করা উচিত নয়, পরিবর্তে অবজেক্ট.জেটপ্রোটোটাইপ (বস্তু) ব্যবহার করা উচিত।

প্রথম প্রশ্নের উত্তর দেওয়ার জন্য, আমি একটি স্পোক ডায়াগ্রাম __proto__এবং prototypeরেফারেন্স তৈরি করেছি , দুর্ভাগ্যক্রমে স্ট্যাকওভারফ্লো আমাকে "10 এর কম খ্যাতি" দিয়ে ছবিটি যুক্ত করতে দেয় না। হয়তো অন্য সময়.

[সম্পাদনা] চিত্রটি এর [[Prototype]]পরিবর্তে ব্যবহার করে __proto__কারণ ইসিএমএসক্রিপ্টের নির্দিষ্টকরণটি অভ্যন্তরীণ বস্তুগুলিকে বোঝায় to আমি আশা করি আপনি সব কিছু বের করতে পারেন।

চিত্রটি বুঝতে আপনাকে সহায়তা করার জন্য এখানে কয়েকটি ইঙ্গিত দেওয়া হয়েছে:

red    = JavaScript Function constructor and its prototype
violet = JavaScript Object constructor and its prototype
green  = user-created objects
         (first created using Object constructor or object literal {},
          second using user-defined constructor function)
blue   = user-defined function and its prototype
         (when you create a function, two objects are created in memory:
          the function and its prototype)

নোট করুন যে constructorসম্পত্তি তৈরি করা বস্তুগুলিতে বিদ্যমান নেই তবে প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।

এখানে চিত্র বর্ণনা লিখুন


@xorcus আপনি এই ব্যাখ্যা দয়া করে করতে পারেন: new MyFunction()একটি বস্তু উদাহরণস্বরূপ যা তার সৃষ্টি __proto__তার ctor প্রোটোটাইপ যা পড়ুন উচিত MyFunction.prototype.তাই কেন MyFunction.prototype.__proto__করতে referes Object.prototype? এটি তার কর্টরের প্রোটোটাইপের প্রতি (আমার প্রথম নমুনার মতো) রেফারেন্স করা উচিত (এটি MyFunction.prototypeবিজ্ঞপ্তি যা MyFunction.prototypeকোনও প্রগাace়তা Myfunction)
রই নমির

@ রোয়ি নমির: মাই ফাংশন.প্রোটোটাইপ .__ প্রোটো__ অবজেক্ট.প্রোটোটাইপকে রেফার করেছে কারণ মাই ফাংশন.প্রোটোটাইপ একটি অবজেক্ট। অবজেক্ট.প্রোটোটাইপ সমস্ত বস্তুর দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত হয় (সাধারণত, এখানেই উত্তরাধিকারের প্রোটোটাইপ চেইন শেষ হয়)। আমি সম্মত নই যে মাই ফাংশন.প্রোটোটাইপ মাই ফাংশনের একটি উদাহরণ। আমার উদাহরণস্বরূপ MyFunction <=> MyFunction.prototype.isPrototypeOf (obj) <=> মাইজ ফাংশন.প্রোটোটাইপ অজব প্রোটোটাইপ চেইনে বিদ্যমান। এটি MyFunction.prototype অবজেক্টের ক্ষেত্রে নয়
xorcus

14

Objectহবা হ'ল, এবং Functionহ'ল আদম, আদম ( Function) হাড় Function.prototypeতৈরি করার জন্য তার হাড় ব্যবহার করে ( Object)। তাহলে আদম ( Function) কে সৃষ্টি করেছেন ? - জাভাস্ক্রিপ্ট ভাষার উদ্ভাবক :-)।

উত্সিনার উত্তর অনুসারে, আমি আরও দরকারী তথ্য যুক্ত করতে চাই।

আমার জন্য সবচেয়ে আশ্চর্যজনক বিষয়টি তার পরিবর্তে সেই Object.__proto__ পয়েন্টগুলি আবিষ্কার করছিল , তবে আমি নিশ্চিত যে এর জন্য একটি ভাল কারণ রয়েছে :-)Function.prototypeObject.prototype

এটা করা উচিত নয়। Object.__proto__নির্দেশ করা উচিত নয় Object.prototype। পরিবর্তে, উদাহরণস্বরূপ Object o, o.__proto__নির্দেশ করা উচিত Object.prototype

(শর্তাদি classএবং instanceজাভাস্ক্রিপ্টে ব্যবহার করার জন্য আমাকে ক্ষমা করুন , তবে আপনি এটি জানেন :-)

আমি মনে করি ক্লাস Objectনিজেই একটি উদাহরণ Function, সে কারণেই Object.__proto__ === Function.prototype। সুতরাং: Objectহবা হ'ল, এবং Functionআদম হ'ল আদম ( Function) হাড় Function.prototypeতৈরি করার জন্য তার হাড় ব্যবহার করে ( Object)।

তদ্ব্যতীত, এমনকি শ্রেণি Functionনিজেই নিজের একটি উদাহরণ Function, এটি হ'ল Function.__proto__ === Function.prototypeএটিওFunction === Function.constructor

তদ্ব্যতীত, নিয়মিত বর্গ Catএকটি উদাহরণ Function, এটি হয় Cat.__proto__ === Function.prototype

উপরের কারণটি হ'ল, যখন আমরা জাভাস্ক্রিপ্টে একটি ক্লাস তৈরি করি, আসলে আমরা কেবল একটি ফাংশন তৈরি করি যা এর উদাহরণ হওয়া উচিত FunctionObjectএবং Functionশুধুমাত্র বিশেষ, তবে তারা এখনও ক্লাস, যখন Catএকটি নিয়মিত ক্লাস।

গুগল ক্রোম জাভাস্ক্রিপ্ট ইঞ্জিনে ফ্যাক্টর হিসাবে, নিম্নলিখিত 4:

  • Function.prototype
  • Function.__proto__
  • Object.__proto__
  • Cat.__proto__

তারা ===অন্য 3 এর সাথে সমস্ত (একেবারে সমান) এবং তাদের মান isfunction Empty() {}

> Function.prototype
  function Empty() {}
> Function.__proto__
  function Empty() {}
> Object.__proto__
  function Empty() {}
> Cat.__proto__
  function Empty() {}
> Function.prototype === Function.__proto__
  true
> Function.__proto__ === Object.__proto__
  true
> Object.__proto__ === Cat.__proto__
  true

ঠিক আছে. তাহলে বিশেষ function Empty() {}( Function.prototype) কে তৈরি করেন ? চিন্তা করুন :-)


এর সাথে একমত হোন, শেষ একটি জিনিস ব্যতীত: function Empty() {}ফাংশন.প্রোটোটাইপ ইত্যাদির সমান হওয়ার বিষয়ে আপনি কী বোঝেন? ক্রোম কনসোলে আপনি কোডটি কী ব্যবহার করেছেন?
ড্রডসৌ

2
আপনি যেটা দেখিয়েছিলেন তা আমি শেষ করেছিলাম। function Empty() {}গুগল ক্রোমে তাদের মান । আমি কনসোল আউটপুটও যুক্ত করেছি।
পিটার লি

সমস্ত ফাংশন হ'ল উদাহরণস্বরূপ ফাংশন এবং সুতরাং, সমস্ত ফাংশন ফাংশন.প্রোটোটাইপ _ _proto_ _থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় । এটি
এতটা

পুরানো থ্রেডে মন্তব্য করার জন্য দুঃখিত। কিন্তু সেগুলি কি ভাষার উদ্ভাবক দ্বারা নির্মিত?
পটেল পার্থ

6

আপনার বোঝার আসল সমস্যাটি কোথায় লোকেরা আপনাকে সংশোধন করেনি তা আমি সত্যই জানি না।

সমস্যাটি চিহ্নিত করা আপনার পক্ষে এটি অনেক সহজ করে তুলবে

সুতরাং আসুন দেখুন কি চলছে:

var newtoy = new Gadget("webcam", "black")

newtoy 
  .constructor //newtoy's constructor function is newtoy ( the function itself)
    .prototype // the function has a prototype property.( all functions has)
      .constructor // constructor here is a **property** (why ? becuase you just did `prototype.constructor`... see the dot ? )  ! it is not(!) the constructor function  !!! this is where your mess begins. it points back to the constructor function itself ( newtoy function)
         .prototype // so again we are at line 3 of this code snippet
            .constructor //same as line 4 ...
                .prototype 
                 rating = 3

দুর্দান্ত, সুতরাং এখন এই তাকান __proto__

তার আগে, দয়া করে 2 টি বিষয় সম্পর্কে মনে রাখবেন __proto__ :

  1. আপনি যখন newঅপারেটরটির সাথে কোনও অবজেক্ট তৈরি করেন , এর অভ্যন্তরীণ [[Prototype]]/ proto__সম্পত্তি আপনার পছন্দসই বা prototypeতার constructor function"স্রষ্টা" এর সম্পত্তি (1) এ সেট করা হবে ।

  2. জেএস-এর মধ্যে হার্ড কোডিং -: Object.prototype.__proto__হয় null

এই 2 পয়েন্টগুলি " bill" হিসাবে উল্লেখ করুন

newtoy
     .__proto__ // When `newtoy` was created , Js put __proto__'s value equal to the value of the cunstructor's prototype value. which is `Gadget.prototype`.
       .__proto__ // Ok so now our starting point is `Gadget.prototype`. so  regarding "bill" who is the constructor function now? watch out !! it's a simple object ! a regular object ! prototype is a regular object!! so who is the constructor function of that object ? Right , it's the `function Object(){...}`.  Ok .( continuing "bill" ) does it has a `prototype` property ? sure. all function has. it's `Object.prototype`. just remember that when Gadget.prototype was created , it's internal `__proto__` was refered to `Object.prototype` becuase as "bill" says :"..will be set to the `prototype` property of   its `constructor function`"
          .__proto__ // Ok so now our satrting point is `Object.prototype`. STOP. read bullet 2.Object.prototype.__proto__ is null by definition. when Object.prototype ( as an object) was created , they SET THE __PROTO__ AS NULL HARDCODED

উত্তম?


2

প্রতিটি ফাংশন এটির প্রোটোটাইপ তৈরি করে। এবং যখন আমরা সেই ফাংশন কনস্ট্রাক্টর ব্যবহার করে কোনও বস্তু তৈরি করি তখন আমার __Pr____ এর সম্পত্তিটি সেই ফাংশনের প্রোটোটাইপের দিকে নির্দেশ করতে শুরু করবে।


1
আমি মনে করি আপনি __proto__সম্পত্তি বলতে চেয়েছিলেন ।
demisx

হ্যাঁ. আমি কোনও বস্তুর প্রোটো সম্পত্তি বোঝাতে চাইছি । আমি আশা করি তথ্য কার্যকর ছিল।
অপুরভ নাগ

2

যদি এই সমস্ত পরিসংখ্যান অপ্রতিরোধ্য হয়, তবে আসুন দেখে নেওয়া যাক এর বৈশিষ্ট্যগুলি কী বোঝায়।

STH.prototype

একটি নতুন ফাংশন তৈরি করার সময়, এখানে একটি ফাঁকা বস্তু সমান্তরালভাবে তৈরি করা হচ্ছে এবং [[Prototype]]শৃঙ্খলের সাথে ফাংশনের সাথে যুক্ত linked এই বস্তুটি অ্যাক্সেস করতে, আমরা prototypeফাংশনের সম্পত্তি ব্যবহার করি ।

function Gadget() {}
// in background, new object has been created
// we can access it with Gadget.prototype
// it looks somewhat like {constructor: Gadget}

স্মরণে রাখা যে prototype সম্পত্তিটি কেবল ফাংশনের জন্য উপলব্ধ।

STH.constructor

উপরে উল্লিখিত প্রোটোটাইপ অবজেক্টের একটি ছাড়া - কোনও বৈশিষ্ট্য নেই constructor। এই সম্পত্তিটি এমন একটি ফাংশন উপস্থাপন করে যা প্রোটোটাইপ অবজেক্ট তৈরি করেছিল।

var toy = new Gadget();

Gadgetফাংশন তৈরি করার সময় , আমরা {constructor: Gadget}পাশাপাশি একটি বস্তু তৈরি করেছি - এটি কিছুই নয় Gadget.prototype। যেমন constructorকোনও ফাংশনকে বোঝায় যা একটি অবজেক্ট প্রোটোটাইপ তৈরি করেছে, ফাংশনকে toy.constructorউপস্থাপন Gadgetকরে। আমরা লিখি toy.constructor.prototypeএবং আমরা পাচ্ছি{constructor: Gadget} আবার ।

অতএব, একটি জঘন্য চেনাশোনা রয়েছে: আপনি ব্যবহার করতে পারেন toy.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototypeএবং এটি সর্বদা থাকবে Gadget.prototype

toy
.constructor    // Gadget
.prototype    // {constructor: Gadget}
.constructor    // Gadget
.prototype    // {constructor: Gadget}
// ...

হেলায় .__ proto__

যদিও prototypeকাজগুলির জন্য একটি সম্পত্তি নির্দিষ্ট হয়, __proto__সব অবজেক্টের জন্য উপলব্ধ হিসাবে এটা টিম সীমানা হয় Object.prototype। এটি এমন কোনও ফাংশনের প্রোটোটাইপকে বোঝায় যা কোনও অবজেক্ট তৈরি করতে পারে।

[].__proto__ === Array.prototype
// true

({}).__proto === Object.prototype
// true

এখানে, toy.__proto__হয় Gadget.prototype। হিসাবে Gadget.prototypeএকটি বস্তু (হয় {}) এবং বস্তুর সঙ্গে নির্মিত Object(উপরে উদাহরণ দেখুন) ফাংশন, আমরা পেতে Object.prototype। এটি জাভাস্ক্রিপ্টে উচ্চতর বস্তু এবং এটি __proto__কেবল নির্দেশ করতে পারে null

toy
.__proto__    // Gadget.prototype (object looking like {constructor: Gadget})
.__proto__    // Object.prototype (topmost object in JS)
.__proto__    // null - Object.prototype is the end of any chain

0

সংক্ষিপ্ত উত্তর: কনস্ট্রাক্টরের সম্পত্তি সম্পর্কিত __proto__একটি রেফারেন্স prototypeযা বস্তুটি তৈরি করেছিল।

জাভাস্ক্রিপ্টে অবজেক্টস

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

জাভাস্ক্রিপ্টে নির্মাণকারী

ক্রিয়াকলাপগুলি নিয়মিত অবজেক্ট (যা [[Call]]ইসিএমএ-262 পদগুলিতে প্রয়োগ করা হয়) কলযোগ্য হওয়ার অতিরিক্ত ক্ষমতা সহ কিন্তু জাভাস্ক্রিপ্টে আরও একটি ভূমিকা পালন করে: তারা কনস্ট্রাক্টর ( বস্তুর জন্য কারখানা ) হয়ে যায় যদি এর মাধ্যমে আহ্বান করা হয়new অপারেটরের । নির্মাতারা এইভাবে অন্যান্য ভাষার ক্লাসের জন্য মোটামুটি এনালগ।

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

কনস্ট্রাক্টর prototypeহ'ল বিল্ডিং অবজেক্টের জন্য এক প্রকারের নীলনকশা, যেহেতু কনস্ট্রাক্টরের তৈরি প্রতিটি বস্তু তার রেফারেন্স উত্তরাধিকার সূত্রে পায়prototype

প্রোটোটাইপ চেইন

কোনও বস্তু অভ্যন্তরীণ সম্পত্তি [[Prototype]]বা এর মাধ্যমে তার প্রোটোটাইপ নির্দিষ্ট করে __proto__। দুটি বস্তুর মধ্যে প্রোটোটাইপ সম্পর্ক উত্তরাধিকার সম্পর্কে: প্রতিটি বস্তুর নিজস্ব প্রোটোটাইপ হিসাবে অন্য একটি বস্তু থাকতে পারে। প্রোটোটাইপ nullমান হতে পারে ।

__proto__সম্পত্তি দ্বারা সংযুক্ত বস্তুর শৃঙ্খলা প্রোটোটাইপ চেইন বলা হয় । যখন কোনও বস্তুর কোনও সম্পত্তির জন্য রেফারেন্স তৈরি করা হয়, সেই রেফারেন্সটি হ'ল প্রোটোটাইপ শৃঙ্খলে প্রথম বস্তুর মুখোমুখি সেই সম্পত্তির সাথে সেই নামের একটি সম্পত্তি থাকে। প্রোটোটাইপ চেইন এমন আচরণ করে যেন এটি কোনও একক বস্তু were

এই চিত্রটি দেখুন (এই ব্লগ থেকে বের করা ):

proto.jpg

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

প্রোটোটাইপ চেইন ব্যবহার করে এই ধরণের উত্তরাধিকারকে ক্লাস চেইন ব্যবহার করে অন্যান্য ভাষার সাথে বিভ্রান্তি এড়াতে প্রতিনিধি বলা হয় ।

প্রায় সমস্ত বস্তু উদাহরণস্বরূপ Object, কারণ Object.prototypeতাদের প্রোটোটাইপ শৃঙ্খলে সর্বশেষ। তবে এর মূল্য Object.prototypeনেই Objectকারণ Object.prototype.__proto__এটির মান রয়েছে null

আপনি nullএই জাতীয় প্রোটোটাইপ দিয়ে একটি বস্তু তৈরি করতে পারেন :

var dict = Object.create(null);

এই জাতীয় কোনও বস্তু আক্ষরিক বস্তুর চেয়ে ভাল মানচিত্র (অভিধান), তাই এই প্যাটার্নটিকে কখনও কখনও ডিক প্যাটার্ন ( ডিক) বলা হয় অভিধানের জন্য ) বলা হয়।

নোট: আক্ষরিক ব্যবহার করে তৈরি করা বস্তু {}উদাহরণ স্বরূপ ধরে Objectযেহেতু ({}).__proto__একটি রেফারেন্স Object.prototype


আপনি ব্যবহার করছেন উদ্ধৃতি এবং শৈল্পিক উত্স উদ্ধৃত করুন। ছবিটি দেখে মনে হচ্ছে giamir.com/pseudoclass- এবং- প্রোটোটাইপাল- ইনহিরিট্যান্স- ইন- জেএস থেকে আপনার কি কপিরাইট আছে?
বার্গি

@ বার্গি আমি চিত্রটির উত্স উদ্ধৃত করেছিলাম। আমি ব্যবহার করা বেশিরভাগ উদ্ধৃতিগুলি হয় জেএস স্ট্যান্ডার্ড বা এমডিএন থেকে নেওয়া হয়েছে
আইজেনস্ল্যাকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.