জাভাস্ক্রিপ্ট .প্রোটোটাইপ কীভাবে কাজ করে?


2041

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

var obj = new Object();
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();

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

তবে জাভাস্ক্রিপ্টে এই ".প্রোটোটাইপ" সম্পত্তিটির সঠিক উদ্দেশ্য কী? এটি কীভাবে তাত্ক্ষণিক বস্তুর সাথে সম্পর্কিত?

আপডেট: সঠিক উপায়

var obj = new Object(); // not a functional object
obj.prototype.test = function() { alert('Hello?'); }; // this is wrong!

function MyObject() {} // a first class functional object
MyObject.prototype.test = function() { alert('OK'); } // OK

এছাড়াও এই স্লাইডগুলি সত্যই অনেক সাহায্য করেছিল।


78
জন রেসিগের ফাংশন প্রোটোটাইপগুলিতে কয়েকটি স্লাইড রয়েছে যা বিষয়টি দেখার সময় আমার পক্ষে সহায়ক ছিল (আপনি কোডটিতেও পরিবর্তন আনতে পারেন এবং কী হয় তা দেখতে পারেন ...) http://ejohn.org/apps/learn/#64
জন ফস্টার

5
দুর্দান্ত রেফারেন্স উপাদান, এই প্রশ্নটি তথ্যবহুল রাখার উদ্দেশ্যে সম্ভবত আপনার সাইটের উত্তরে জন এর সাইট থেকে কিছু মন্তব্য রাখতে হবে যদি আপনার সাইটটি এমনভাবে পরিবর্তিত হয় যাতে আপনার লিঙ্কটি আর উপলব্ধ না থাকে। যেভাবেই হোক +1, আমাকে সহায়তা করেছে।
ক্রিস

95
জন রেসিগের জাভাস্ক্রিপ্ট নিনজা স্লাইড # 64-এ আপনার লিঙ্কের জন্য +1 । সেখান থেকে শুরু করা সত্যিই সহায়ক ছিল এবং আমার মনে হয় আমি প্রোটোটাইপগুলি সঠিকভাবে বুঝতে পারি।
একটি প্রদত্ত নার্দ

4
প্রোটোটাইপ প্রয়োগের জন্য আমাদের কি সত্যই কোনও কার্যকরী বস্তুর প্রয়োজন? যদি হ্যাঁ তবে কেন?
আনশুল

6
এটি আপনাকে সহায়তা করতে পারে: webdeveasy.com/javascript- প্রোটোটাইপ
নাওর

উত্তর:


1007

প্রতিটি জাভাস্ক্রিপ্ট অবজেক্টের একটি অভ্যন্তরীণ "স্লট" থাকে [[Prototype]]যার মান হয় nullবা একটি object। আপনি যে কোডটি লিখেছেন তা থেকে লুকানো কোনও জাভাস্ক্রিপ্ট ইঞ্জিনের অভ্যন্তরের কোনও বস্তুর সম্পত্তি হিসাবে স্লটকে ভাবতে পারেন। চারপাশের বর্গাকার বন্ধনীগুলি [[Prototype]]ইচ্ছাকৃত, এবং অভ্যন্তরীণ স্লট বোঝাতে একটি ECMAScript স্পেসিফিকেশন কনভেনশন।

যে [[Prototype]]কোনও বস্তুর দ্বারা চিহ্নিত মান , কথোপকথন হিসাবে "" সেই বস্তুর প্রোটোটাইপ "হিসাবে পরিচিত।

আপনি যদি বিন্দু ( obj.propName) বা বন্ধনী ( obj['propName']) স্বরলিপি দ্বারা কোনও সম্পত্তি অ্যাক্সেস করেন এবং অবজেক্টের সরাসরি এ জাতীয় সম্পত্তি নেই (যেমন , একটি নিজস্ব সম্পত্তি , যার মাধ্যমে চেকযোগ্য obj.hasOwnProperty('propName')) তারপরে রানটাইম রেফারেন্সযুক্ত বস্তুর উপর সেই নামের একটি সম্পত্তি অনুসন্ধান করে looks [[Prototype]]পরিবর্তে দ্বারা যদি এর [[Prototype]] মধ্যেও এইরকম সম্পত্তি না থাকে তবে তার [[Prototype]]বদলে চেক করা হবে, ইত্যাদি। এইভাবে, কোনও মিল খুঁজে পাওয়া না যাওয়া বা তার শেষ না হওয়া পর্যন্ত আসল অবজেক্টের প্রোটোটাইপ চেইনটি হাঁটা হয়। প্রোটোটাইপ চেইনের শীর্ষে nullমান।

আধুনিক জাভাস্ক্রিপ্ট প্রয়োগগুলি [[Prototype]]নিম্নলিখিত উপায়ে পড়তে এবং / অথবা লেখার অ্যাক্সেসকে মঞ্জুরি দেয় :

  1. newঅপারেটর (কনফিগার করে একটি কন্সট্রাকটর ফাংশন থেকে ফেরত ডিফল্ট বস্তুর উপর প্রোটোটাইপ শৃঙ্খল),
  2. extendsশব্দ (যখন বর্গ সিনট্যাক্স ব্যবহার প্রোটোটাইপ শৃঙ্খল কনফিগার),
  3. Object.createসরবরাহকৃত আর্গুমেন্টকে [[Prototype]]ফলাফলের বস্তুর হিসাবে সেট করবে ,
  4. Object.getPrototypeOfএবং Object.setPrototypeOf( অবজেক্ট তৈরির [[Prototype]] পরে / সেট করুন ), এবং
  5. মানকযুক্ত অ্যাক্সেসর (অর্থাত্ গেটার / সেটার) নামের সম্পত্তি __proto__(৪ টির মতো)

Object.getPrototypeOfএবং কিছুটা Object.setPrototypeOfবেশি পছন্দ করা হয় __proto__, কারণ কোনও বস্তুর প্রোটোটাইপ থাকলে আচরণটি o.__proto__ অস্বাভাবিকnull

কোনও বস্তুর [[Prototype]]শুরুতে অবজেক্ট তৈরির সময় সেট করা হয়।

যদি আপনি এর মাধ্যমে কোনও নতুন অবজেক্ট তৈরি করেন new Func()তবে [[Prototype]]ডিফল্টরূপে অবজেক্টের উইলটি রেফারেন্স করা অবজেক্টে সেট হয়ে যাবে Func.prototype

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

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

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

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

এখানে একটি উপায়:

function Child() {}
function Parent() {}
Parent.prototype.inheritedMethod = function () { return 'this is inherited' }

function inherit(child, parent) {
  child.prototype = Object.create(parent.prototype)
  child.prototype.constructor = child
  return child;
}

Child = inherit(Child, Parent)
const o = new Child
console.log(o.inheritedMethod()) // 'this is inherited'

... এবং এখানে অন্য উপায়:

function Child() {}
function Parent() {}
Parent.prototype.inheritedMethod = function () { return 'this is inherited' }

function inherit(child, parent) {
    function tmp() {}
    tmp.prototype = parent.prototype
    const proto = new tmp()
    proto.constructor = child
    child.prototype = proto
    return child
}

Child = inherit(Child, Parent)
const o = new Child
console.log(o.inheritedMethod()) // 'this is inherited'

ES2015 এ প্রবর্তিত শ্রেণি বাক্য গঠন extendsজাভাস্ক্রিপ্টে শাস্ত্রীয় উত্তরাধিকার অনুকরণের জন্য প্রোটোটাইপ চেইনটি কনফিগার করার জন্য "একটি সত্য উপায়" হিসাবে সরবরাহ করে বিষয়গুলিকে সহজতর করে।

সুতরাং, উপরের কোডের অনুরূপ, আপনি যদি শ্রেণীর বাক্য গঠনটি নতুন কোনও অবজেক্ট তৈরি করতে ব্যবহার করেন:

class Parent { inheritedMethod() { return 'this is inherited' } }
class Child extends Parent {}

const o = new Child
console.log(o.inheritedMethod()) // 'this is inherited'

... ফলস্বরূপ অবজেক্টগুলির [[Prototype]]একটি উদাহরণে সেট করা হবে Parent, যার [[Prototype]]পরিবর্তে, এটি Parent.prototype

অবশেষে, আপনি যদি এর মাধ্যমে কোনও নতুন অবজেক্ট তৈরি করেন Object.create(foo)তবে ফলস্বরূপ অবজেক্টটি [[Prototype]]সেট হয়ে যাবে foo


1
সুতরাং, আমি আমার সংক্ষিপ্ত স্নিপেটে প্রোটোটাইপ সম্পত্তিটিতে নতুন বৈশিষ্ট্য সংজ্ঞায়িত করে কিছু ভুল করছি?
জন লিডেগ্রেন

3
আমি মনে করি এটি প্রথম শ্রেণীর নাগরিক হিসাবে ফাংশন অবজেক্টগুলির মানে।
জন লেইডগ্রেন

8
আমি অ-মানক জিনিসগুলিকে ঘৃণা করি, বিশেষত প্রোগ্রামিং ভাষাগুলিতে, কেন প্রোটো যখন এর স্পষ্টভাবে প্রয়োজন হয় না কেন?
জন লেইডগ্রেন

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

17
নোট করুন যে [[প্রোটোটাইপ]] ইচ্ছাকৃত - ECMA-262 ডাবল স্কোয়ার বন্ধনী সহ অভ্যন্তরীণ বৈশিষ্ট্যগুলির নাম আবদ্ধ করেছে
ক্রিস্টোফ

1798

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

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

উদাহরণ:

//Define a functional object to hold persons in JavaScript
var Person = function(name) {
  this.name = name;
};

//Add dynamically to the already defined object a new getter
Person.prototype.getName = function() {
  return this.name;
};

//Create a new object of type Person
var john = new Person("John");

//Try the getter
alert(john.getName());

//If now I modify person, also John gets the updates
Person.prototype.sayMyName = function() {
  alert('Hello, my name is ' + this.getName());
};

//Call the new method on john
john.sayMyName();

এখন অবধি আমি বেস অবজেক্টটি প্রসারিত করেছি, এখন আমি অন্য একটি বস্তু তৈরি করি এবং তারপরে ব্যক্তি থেকে উত্তরাধিকার সূত্রে পাই।

//Create a new object of type Customer by defining its constructor. It's not 
//related to Person for now.
var Customer = function(name) {
    this.name = name;
};

//Now I link the objects and to do so, we link the prototype of Customer to 
//a new instance of Person. The prototype is the base that will be used to 
//construct all new instances and also, will modify dynamically all already 
//constructed objects because in JavaScript objects retain a pointer to the 
//prototype
Customer.prototype = new Person();     

//Now I can call the methods of Person on the Customer, let's try, first 
//I need to create a Customer.
var myCustomer = new Customer('Dream Inc.');
myCustomer.sayMyName();

//If I add new methods to Person, they will be added to Customer, but if I
//add new methods to Customer they won't be added to Person. Example:
Customer.prototype.setAmountDue = function(amountDue) {
    this.amountDue = amountDue;
};
Customer.prototype.getAmountDue = function() {
    return this.amountDue;
};

//Let's try:       
myCustomer.setAmountDue(2000);
alert(myCustomer.getAmountDue());

যেমনটি বলা হয়েছে আমি কোনও ব্যক্তির উপর সেটঅ্যামাউন্টডিউ (), getAmountDue () কল করতে পারি না।

//The following statement generates an error.
john.setAmountDue(1000);

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

7
যতদূর আমি বুঝতে পারি var পার্সন = ফাংশন (নাম) {...}; ব্যক্তি অবজেক্ট তৈরিতে সক্ষম একটি কনস্ট্রাক্টর ফাংশন সংজ্ঞায়িত করছে। সুতরাং এখনও কোন অবজেক্ট নেই, কেবল বেনামে কনস্ট্রাক্টর ফাংশন ব্যক্তিকে দেওয়া হয়েছে। এটি খুব ভাল ব্যাখ্যা: helephant.com/2008/08/how-javascript-objects-work
stivlo

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

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

10
Customer.prototype = new Person();রেখাটি সম্পর্কে , MDN ব্যবহার করে একটি উদাহরণ দেখায় Customer.prototype = Object.create(Person.prototype)এবং বলে যে 'এখানে একটি সাধারণ ত্রুটি হল "নতুন ব্যক্তি ()" ব্যবহার করাউত্স
রাফায়েল আইং

186

এটি একটি খুব সাধারণ প্রোটোটাইপ ভিত্তিক অবজেক্ট মডেল যা ব্যাখ্যার সময় একটি নমুনা হিসাবে বিবেচিত হবে, কোনও মন্তব্য ছাড়াই:

function Person(name){
    this.name = name;
}
Person.prototype.getName = function(){
    console.log(this.name);
}
var person = new Person("George");

প্রোটোটাইপ ধারণার মধ্য দিয়ে যাওয়ার আগে আমাদের কয়েকটি গুরুত্বপূর্ণ বিষয় বিবেচনা করতে হবে।

1- জাভাস্ক্রিপ্ট কার্যত কীভাবে কাজ করে:

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

ধরা যাক আমরা একটি Personঅবজেক্ট মডেল তৈরি করতে চাই । তবে এই পদক্ষেপে আমি ব্যবহার না করে একই সঠিক জিনিসটি করার চেষ্টা করবprototypenew শব্দটি এবং কীওয়ার্ড না দিয়ে

সুতরাং এই পদক্ষেপে 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যখন আপনি ব্যবহার newkeyword। সুতরাং যখন আমরা না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এবং এটিও সম্ভব যে এই বস্তুটির এটি রয়েছে নিজস্ব অভ্যন্তরীণ প্রোটোটাইপ। ইত্যাদি।


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

1
@ বার্গি: নির্দেশ করার জন্য ধন্যবাদ, আপনি যদি এখনই ঠিকঠাক থাকেন তবে আমাকে জানাতে পারলে আমি প্রশংসা করব।
মেহরান হাতামী

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

2
@ পিএম: আপনার মতামতের জন্য ধন্যবাদ আমি এটিকে যতটা সম্ভব সহজ করার চেষ্টা করেছি তবে আমি মনে করি আপনি ঠিক বলেছেন এর এখনও কিছু অস্পষ্ট বিষয় রয়েছে। সুতরাং আমি এটিকে সংশোধন করার চেষ্টা করব এবং আরও বর্ণনামূলক হব। :)
মেহরান হাতামি

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

77

প্রোটোটাইপ সাত কোয়ান

গভীর ধ্যানের পরে সিরো সান যখন মাউন্ট ফায়ার ফক্সে নেমেছিলেন, তখন তাঁর মন পরিষ্কার এবং শান্ত ছিল।

তবে তার হাতটি অস্থির হয়ে পড়েছিল এবং নিজেই একটি ব্রাশটি ধরে নীচের নোটগুলিতে টান দেয়।


0) দুটি পৃথক জিনিসকে "প্রোটোটাইপ" বলা যেতে পারে:

  • প্রোটোটাইপ সম্পত্তি হিসাবে হিসাবে obj.prototype

  • প্রোটোটাইপ অভ্যন্তরীণ সম্পত্তি, [[Prototype]] ES5 হিসাবে চিহ্নিত ।

    এটি ES5 এর মাধ্যমে পুনরুদ্ধার করা যেতে পারে Object.getPrototypeOf()

    ফায়ারফক্স __proto__একটি এক্সটেনশন হিসাবে সম্পত্তি মাধ্যমে এটি অ্যাক্সেসযোগ্য করে তোলে । ES6 এর জন্য এখন কিছু alচ্ছিক প্রয়োজনীয়তার কথা উল্লেখ করেছে __proto__


1) এই ধারণাগুলি প্রশ্নের উত্তর দেওয়ার জন্য বিদ্যমান:

আমি যখন করি obj.property, জেএস কোথায় খুঁজবে .property?

স্বজ্ঞাতভাবে, শাস্ত্রীয় উত্তরাধিকার সম্পত্তি অনুসন্ধানে প্রভাবিত করা উচিত।


2)

  • __proto__.হিসাবে বিন্দু সম্পত্তি দেখার জন্য ব্যবহৃত হয় obj.property
  • .prototypeসরাসরি দেখার জন্য ব্যবহৃত হয় না , কেবল পরোক্ষভাবে যেমন এটির __proto__সাথে অবজেক্ট তৈরির সময় নির্ধারণ করে new

অনুসন্ধান আদেশটি হ'ল:

  • objবৈশিষ্ট্য obj.p = ...বা সঙ্গে যুক্তObject.defineProperty(obj, ...)
  • এর সম্পতির obj.__proto__
  • এর বৈশিষ্ট্য obj.__proto__.__proto__, এবং তাই
  • কিছু যদি __proto__হয় null, ফিরে undefined

এটি তথাকথিত প্রোটোটাইপ চেইন

আপনি এবং এর .সাথে অনুসন্ধান এড়াতে পারেনobj.hasOwnProperty('key')Object.getOwnPropertyNames(f)


3) সেট করার দুটি প্রধান উপায় রয়েছে obj.__proto__:

  • new:

    var F = function() {}
    var f = new F()

    তারপরে newসেট করেছেন:

    f.__proto__ === F.prototype

    এটি এখানে .prototypeব্যবহার করা হয়।

  • Object.create:

     f = Object.create(proto)

    সেট:

    f.__proto__ === proto

4) কোড:

var F = function(i) { this.i = i }
var f = new F(1)

নিম্নলিখিত চিত্রের সাথে সংশ্লিষ্ট (কিছু Numberজিনিস বাদ দেওয়া হয়েছে):

(Function)       (  F  )                                      (f)----->(1)
 |  ^             | | ^                                        |   i    |
 |  |             | | |                                        |        |
 |  |             | | +-------------------------+              |        |
 |  |constructor  | |                           |              |        |
 |  |             | +--------------+            |              |        |
 |  |             |                |            |              |        |
 |  |             |                |            |              |        |
 |[[Prototype]]   |[[Prototype]]   |prototype   |constructor   |[[Prototype]]
 |  |             |                |            |              |        |
 |  |             |                |            |              |        |
 |  |             |                | +----------+              |        |
 |  |             |                | |                         |        |
 |  |             |                | | +-----------------------+        |
 |  |             |                | | |                                |
 v  |             v                v | v                                |
(Function.prototype)              (F.prototype)                         |
 |                                 |                                    |
 |                                 |                                    |
 |[[Prototype]]                    |[[Prototype]]          [[Prototype]]|
 |                                 |                                    |
 |                                 |                                    |
 | +-------------------------------+                                    |
 | |                                                                    |
 v v                                                                    v
(Object.prototype)                                       (Number.prototype)
 | | ^
 | | |
 | | +---------------------------+
 | |                             |
 | +--------------+              |
 |                |              |
 |                |              |
 |[[Prototype]]   |constructor   |prototype
 |                |              |
 |                |              |
 |                | -------------+
 |                | |
 v                v |
(null)           (Object)

এই চিত্রটি অনেক ভাষার পূর্বনির্ধারিত অবজেক্ট নোডগুলি দেখায়:

  • null
  • Object
  • Object.prototype
  • Function
  • Function.prototype
  • 1
  • Number.prototype( (1).__proto__সিনট্যাক্স সন্তুষ্ট করার জন্য প্রথম বন্ধনীর সাথে আবশ্যক)

আমাদের 2 লাইনের কোড কেবলমাত্র নিম্নলিখিত নতুন বস্তু তৈরি করেছে:

  • f
  • F
  • F.prototype

iএখন fকারণ এটি করার সম্পত্তি :

var f = new F(1)

এটি যে মানটি ফিরে আসবে তার Fসাথে মূল্যায়ন করে , যা তারপরে নির্ধারিত হয় ।thisnewf


5) .constructor সাধারণত দেখার F.prototypeমাধ্যমে আসে .:

f.constructor === F
!f.hasOwnProperty('constructor')
Object.getPrototypeOf(f) === F.prototype
F.prototype.hasOwnProperty('constructor')
F.prototype.constructor === f.constructor

যখন আমরা লিখি f.constructor, জাভাস্ক্রিপ্টটি লুক্কুলের .মতো করে:

  • f নেই .constructor
  • f.__proto__ === F.prototypeআছে .constructor === F, তাই এটি নিতে

ফলাফলটি f.constructor == Fস্বজ্ঞাতভাবে সঠিক, যেহেতু ক্লাসিক ওওপি ভাষাগুলির মতো, যেমন ক্ষেত্রগুলি নির্ধারণে Fব্যবহৃত হয় f


6) প্রোটোটাইপ চেইনগুলি পরিচালনা করে ধ্রুপদী উত্তরাধিকার সিনট্যাক্স অর্জন করা যেতে পারে।

ES6 টি classএবং extendsকীওয়ার্ডগুলি যুক্ত করে, যা সাধারণত সম্ভব প্রোটোটাইপ ম্যানিপুলেশন পাগলামির জন্য সিনট্যাক্স চিনির হয়।

class C {
    constructor(i) {
        this.i = i
    }
    inc() {
        return this.i + 1
    }
}

class D extends C {
    constructor(i) {
        super(i)
    }
    inc2() {
        return this.i + 2
    }
}
// Inheritance syntax works as expected.
c = new C(1)
c.inc() === 2
(new D(1)).inc() === 2
(new D(1)).inc2() === 3
// "Classes" are just function objects.
C.constructor === Function
C.__proto__ === Function.prototype
D.constructor === Function
// D is a function "indirectly" through the chain.
D.__proto__ === C
D.__proto__.__proto__ === Function.prototype
// "extends" sets up the prototype chain so that base class
// lookups will work as expected
var d = new D(1)
d.__proto__ === D.prototype
D.prototype.__proto__ === C.prototype
// This is what `d.inc` actually does.
d.__proto__.__proto__.inc === C.prototype.inc
// Class variables
// No ES6 syntax sugar apparently:
// http://stackoverflow.com/questions/22528967/es6-class-variable-alternatives
C.c = 1
C.c === 1
// Because `D.__proto__ === C`.
D.c === 1
// Nothing makes this work.
d.c === undefined

সমস্ত পূর্বনির্ধারিত অবজেক্ট ছাড়া সরলীকৃত চিত্র:

(c)----->(1)
 |   i
 |
 |
 |[[Prototype]]
 |
 |
 v    __proto__
(C)<--------------(D)         (d)
| |                |           |
| |                |           |
| |prototype       |prototype  |[[Prototype]] 
| |                |           |
| |                |           |
| |                | +---------+
| |                | |
| |                | |
| |                v v
|[[Prototype]]    (D.prototype)--------> (inc2 function object)
| |                |             inc2
| |                |
| |                |[[Prototype]]
| |                |
| |                |
| | +--------------+
| | |
| | |
| v v
| (C.prototype)------->(inc function object)
|                inc
v
Function.prototype

নিম্নলিখিত কীভাবে কাজ করে তা অধ্যয়নের জন্য এক মুহুর্ত নেওয়া যাক:

c = new C(1)
c.inc() === 2

"4)" c.iতে বর্ণিত হিসাবে প্রথম লাইন সেট করে 1

দ্বিতীয় লাইনে, যখন আমরা করি:

c.inc()
  • .inc[[Prototype]]চেইনের মাধ্যমে পাওয়া যায় : c-> C-> C.prototype->inc
  • আমরা যখন জাভাস্ক্রিপ্টে কোনও ফাংশন হিসাবে কল করি তখন X.Y()জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে ফাংশন কলের অভ্যন্তরে thisসমান হয়ে যায় !XY()

ঠিক একই যুক্তি ব্যাখ্যা করে d.incএবং d.inc2

এই নিবন্ধটি https://javascript.info/class#not-just-a-syntax-sugarclass জানার মতো আরও প্রভাবের কথা উল্লেখ করেছে । তাদের মধ্যে classকিছুটি কীওয়ার্ড ছাড়াই অর্জনযোগ্য নাও হতে পারে (যা যা চেক করুন):


1
@ টমাসব ধন্যবাদ! "আমি জানি না আপনি এটি কোথায় পেয়েছেন": আমি সেই কয়েকটি গতিশীল ভাষা দেখার পরে আমি লক্ষ্য করেছি যে তাদের শ্রেণিবদ্ধের বিষয়ে সর্বাধিক গুরুত্বপূর্ণ কী কী তা হল .লুকিং কীভাবে কাজ করে (এবং কতগুলি ডাটা এর অনুলিপি তৈরি হয়) । তাই আমি এই পয়েন্টটি বোঝার উদ্দেশ্যে রওনা হয়েছি। বাকি হ'ল গুগল + ব্লগ পোস্টগুলি + হাতে একটি জেএস ইন্টারপ্রেটার। :)
সিরো সান্তিলি 法轮功 病毒 审查 六四 事件 法轮功

1
আমি এখনও পয়েন্টটি পাই না কেন কেন g.constructor === অবজেক্ট কারণ আপনি বলেছিলেন যে "4) আপনি যখন f = নতুন এফ করেন তখন নতুন সেটও করে দেয় f.constructor = F"। আপনি আমাকে আরও ব্যাখ্যা করতে পারেন? যাইহোক এটি আমি সেরা উত্তরটি খুঁজছি। তোমাকে অনেক ধন্যবাদ!
nguyenngoc101

@ nguyenngoc101 ধন্যবাদ! sets f.constructor = Fঅংশ blatantly ভুল এবং আরও বিভাগগুলিতে সহজেই অসঙ্গতি ছিল: .constructorমাধ্যমে পাওয়া যায় .প্রোটোটাইপ শৃঙ্খল উপর নজর রাখাকে। এটি এখনই স্থির করুন।
সিরো সান্তিলি 冠状 病毒 审查 六四 事件

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

1
@CiroSantilli 刘晓波 死 六四 事件 法轮功 আমি মনে করি না এটি ক্রোমিয়ামের কোনও বাগ। আমি মনে করি এটি কেবলমাত্র একটি নির্মাণ সময় fথেকেই প্রোটোটাইপ সেট করা একটি লক্ষণ F; এটি প্রথম নির্মিত হওয়ার পরে কোনও দিনই fজানতে বা যত্ন নেবে না F.prototype
জন গ্লাসমিয়ার

76

prototypeআপনি ক্লাস করতে পারবেন। আপনি যদি ব্যবহার না করেন prototypeতবে এটি একটি অচল হয়ে যায়।

এখানে একটি ছোট উদাহরণ।

var obj = new Object();
obj.test = function() { alert('Hello?'); };

উপরের ক্ষেত্রে, আপনার কাছে স্ট্যাটিক ফানকেশন কল পরীক্ষা রয়েছে। এই ফাংশনটি কেবল আপজ.টেস্ট দ্বারা অ্যাক্সেস করা যেতে পারে যেখানে আপনি ক্লাস হিসাবে আপত্তি কল্পনা করতে পারেন।

যেখানে নীচের কোড হিসাবে

function obj()
{
}

obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();

আপত্তিটি একটি শ্রেণিতে পরিণত হয়েছে যা এখন তাত্ক্ষণিকভাবে চালু করা যেতে পারে। আপত্তি একাধিক দৃষ্টান্ত উপস্থিত থাকতে পারে এবং তাদের সকলের testকার্যকারিতা রয়েছে।

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


13
-1: prototypeকনস্ট্রাক্টর ফাংশনগুলির একটি সম্পত্তি, উদাহরণ নয়, যেমন আপনার কোডটি ভুল! সম্ভবত আপনি __proto__অবজেক্টের অ-মানক সম্পত্তি বোঝাতে চেয়েছিলেন তবে এটি সম্পূর্ণ ভিন্ন জন্তু ...
ক্রিস্টোফ

@ ক্রিসটফ - এটি দেখানোর জন্য ধন্যবাদ আমি নমুনা কোড আপডেট করেছি।
রমেশ

3
এর আরও অনেক কিছু রয়েছে ... প্লাস জাভাস্ক্রিপ্ট কোনও শ্রেণিবদ্ধ ভাষা নয় - এটি প্রোটোটাইপের মাধ্যমে উত্তরাধিকার নিয়ে কাজ করে, আপনাকে আরও বিশদে বিশদগুলি আবরণ করা দরকার!
জেমস

5
আমি মনে করি এই উত্তরটি কিছুটা বিভ্রান্তিকর।
আর্মিন সিফুয়েন্টেস

সম্ভবত উত্তরটি 'বিভ্রান্তিকর', তবে কী প্রোটোটাইপ ব্যবহার করা হয় তা ব্যাখ্যা করে এবং এখন আমার কাছে সমস্ত স্পষ্ট, শত শত 'আপ' ভোট সহ সমস্ত 'উত্তর' পরে। ধন্যবাদ.
আলেকস

66

এই থ্রেডটি পড়ার পরে, আমি জাভাস্ক্রিপ্ট প্রোটোটাইপ চেইনের সাথে বিভ্রান্ত বোধ করছি, তখন আমি এই চার্টগুলি পেয়েছি

http://iwiki.readthedocs.org/en/latest/javascript/js_core.html#inheritance * [[প্রোটাইটিপ]] * এবং <কোড> প্রোটোটাইপ </ কোড> ফাংশন সামগ্রীর সম্পত্তি

প্রোটোটাইপ চেইন দ্বারা জাভাস্ক্রিপ্ট উত্তরাধিকার দেখানোর জন্য এটি একটি পরিষ্কার চার্ট

এবং

http://www.javascriptbank.com/javascript/article/JavaScript_Classical_Inheritance/

এটিতে কোড এবং বেশ কয়েকটি দুর্দান্ত ডায়াগ্রামের একটি উদাহরণ রয়েছে।

প্রোটোটাইপ চেইন শেষ পর্যন্ত অবজেক্ট.প্রোটোটাইপের কাছে ফিরে আসে।

প্রোটোটাইপ চেইন যতক্ষণ আপনি চান প্রযুক্তিগতভাবে বাড়ানো যেতে পারে, প্রতিবারের জন্য প্যারেন্ট ক্লাসের একটি অবজেক্টের সমতল সাবক্লাসের প্রোটোটাইপ সেট করে।

আশা করি জাভাস্ক্রিপ্ট প্রোটোটাইপ চেইন বুঝতে এটি আপনার পক্ষে সহায়ক।


জাভাস্ক্রিপ্টে একাধিক উত্তরাধিকার পাওয়া সম্ভব?

এখানে কি ফু কি কোনও বস্তু আক্ষরিক বা ফাংশন অবজেক্ট? যদি এটি কোনও বস্তুটি আক্ষরিক হয় তবে আমি বিশ্বাস করি Foo.prototype কনস্ট্রাক্টরের মাধ্যমে ফু-কে নির্দেশ করবে না।
মধুর আহুজা

@ ব্যবহারকারীর 3376708 জাভাস্ক্রিপ্ট কেবল একক উত্তরাধিকার ( উত্স ) সমর্থন করে
রাফায়েল আইং

@ নুনো_147৪ এটি প্রথমে পরিষ্কার নয় তবে আপনি যদি যথেষ্ট দীর্ঘ দেখেন তবে আপনি এ থেকে কিছু পেতে পারেন।
মার্সেলোক্রোক

3
আপনি কি ব্যাখ্যা করতে পারবেন [[Prototype]]?
কোডি বাগস্টিন

40

প্রতিটি বস্তুর একটি অভ্যন্তরীণ সম্পত্তি রয়েছে, [[প্রোটোটাইপ]] , এটি অন্য কোনও বস্তুর সাথে সংযুক্ত করে:

object [[Prototype]]  anotherObject

প্রচলিত জাভাস্ক্রিপ্টে, লিঙ্কযুক্ত বস্তু হ'ল prototypeএকটি ফাংশনের সম্পত্তি:

object [[Prototype]]  aFunction.prototype

কিছু পরিবেশের এক্সপোজ [[Prototype]] এ যেমন __proto__:

anObject.__proto__ === anotherObject

কোনও বস্তু তৈরি করার সময় আপনি [[প্রোটোটাইপ]] লিঙ্কটি তৈরি করেন।

// (1) Object.create:
var object = Object.create(anotherObject)
// object.__proto__ = anotherObject

// (2) ES6 object initializer:
var object = { __proto__: anotherObject };
// object.__proto__ = anotherObject

// (3) Traditional JavaScript:
var object = new aFunction;
// object.__proto__ = aFunction.prototype

সুতরাং এই বিবৃতি সমতুল্য:

var object = Object.create(Object.prototype);
var object = { __proto__: Object.prototype }; // ES6 only
var object = new Object;

আপনি আসলে নতুন বিবৃতিতে লিঙ্ক লক্ষ্য ( Object.prototype) দেখতে পাচ্ছেন না ; পরিবর্তে লক্ষ্য নির্ধারক দ্বারা আবদ্ধ হয় ( )।Object

মনে রাখবেন:

  • প্রতিটি বস্তুর একটি লিঙ্ক, [[প্রোটোটাইপ]] থাকে , যা কখনও কখনও __ প্রোফাইল__ হিসাবে প্রকাশিত হয় ।
  • প্রতিটি ফাংশনের একটি prototypeসম্পত্তি থাকে, প্রাথমিকভাবে একটি খালি অবজেক্ট ধরে।
  • নতুন দিয়ে নির্মিত বস্তুগুলি prototypeতাদের নির্মাণকারীর সম্পত্তির সাথে যুক্ত ।
  • যদি কোনও ফাংশন কখনই কনস্ট্রাক্টর হিসাবে ব্যবহার না করা হয় তবে এর prototypeসম্পত্তি অব্যবহৃত হবে।
  • আপনার যদি কনস্ট্রাক্টরের প্রয়োজন না হয় তবে এর পরিবর্তে অবজেক্ট.ক্রেট ব্যবহার করুন new

1
পুনর্বিবেচনা 5টি Object.create () সম্পর্কিত তথ্য সহ কিছু দরকারী তথ্য সরিয়ে নিয়েছে। সংশোধন 4 দেখুন ।
পেরেক

@ প্লেকে আমার কী যোগ করা উচিত?
স্যাম

2
আইএমও কমপক্ষে Object.create()ডক্সের লিঙ্ক , @ স্যাম। লিঙ্কগুলি __proto__এবং দুর্দান্ত Object.prototypeবর্ধন হবে। এবং প্রোটোটাইপগুলি কনস্ট্রাক্টরগুলির সাথে কীভাবে কাজ করে তার উদাহরণগুলি আমি পছন্দ করেছি এবং Object.create()তবে তারা সম্ভবত আপনি দীর্ঘ ও কম প্রাসঙ্গিক অংশটি থেকে মুক্তি পেতে চেয়েছিলেন।
প্যালেক

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

29

জাভাস্ক্রিপ্টের স্বাভাবিক অর্থে উত্তরাধিকার নেই, তবে এতে প্রোটোটাইপ চেইন রয়েছে।

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

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

প্রোটোটাইপে কোনও ফাংশন / ভেরিয়েবল যুক্ত করার সুবিধাটি হ'ল এটি প্রতিটি বারের জন্য নয়, কেবল একবারেই মেমরিতে থাকতে হবে।

এটি উত্তরাধিকারের জন্যও দরকারী, কারণ প্রোটোটাইপ চেইনে অন্যান্য অনেকগুলি বস্তু থাকতে পারে।


1
এফএফ এবং ক্রোম প্রোটো সমর্থন করে তবে আইই বা অপেরা নয়।
কিছু

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

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

28

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

জাভাস্ক্রিপ্ট মূলত দুই ধরণের ডেটা ধরণের থাকে

  • অ অবজেক্টস
  • অবজেক্টস

অ অবজেক্টস

নীচে নন অবজেক্ট ডেটা ধরণের রয়েছে

  • দড়ি
  • সংখ্যা (এনএএন এবং ইনফিনিটি সহ)
  • বুলিয়ান মান (সত্য, মিথ্যা)
  • অনির্দিষ্ট

আপনি টাইপ অফ অপারেটর ব্যবহার করার পরে এই ডেটা টাইপগুলি অনুসরণ করে ফিরে আসে

টাইপফ "স্ট্রিং আক্ষরিক" (বা স্ট্রিং আক্ষরিক সমন্বিত একটি চলক) === 'স্ট্রিং'

টাইপফ 5 (অথবা যে কোনও সংখ্যাসূচক আক্ষরিক বা একটি অক্ষর সংখ্যার আক্ষরিক বা এনএএন বা ইনফিনিটি রয়েছে ) === 'সংখ্যা'

টাইপ করুন সত্য (বা মিথ্যা বা সত্য বা মিথ্যা সমন্বিত একটি পরিবর্তনশীল ) === 'বুলিয়ান'

typeof undefined (অথবা অনির্ধারিত পরিবর্তনশীল বা একটি পরিবর্তনশীল ধারণকারী undefined ) === 'অনির্ধারিত'

স্ট্রিং , সংখ্যা এবং বুলিয়ান ধরনের তথ্য উভয় হিসাবে প্রতিনিধিত্ব করা যাবে অবজেক্টস এবং অ বস্তু .When তারা বস্তু typeof সবসময় === 'অবজেক্ট' হল প্রতিনিধিত্ব করা হয়। অবজেক্টের ডেটা প্রকারগুলি বুঝতে পারলে আমরা এটিতে ফিরে আসব।

অবজেক্টস

অবজেক্ট ডেটাটাইপগুলি আরও দুটি ধরণের মধ্যে বিভক্ত করা যেতে পারে

  1. ফাংশন ধরণের অবজেক্টস
  2. নন ফাংশন ধরণের অবজেক্টস

ফাংশন টাইপ বস্তু বেশী যে স্ট্রিং আসতে হয় 'ফাংশনটি' সঙ্গে typeof অপারেটর। সমস্ত ব্যবহারকারী সংজ্ঞায়িত ফাংশন এবং অবজেক্টগুলিতে নির্মিত সমস্ত জাভাস্ক্রিপ্ট যা নতুন অপারেটর ব্যবহার করে নতুন অবজেক্ট তৈরি করতে পারে এই বিভাগে আসে। যেমন যেমন

  • উদ্দেশ্য
  • দড়ি
  • সংখ্যা
  • বুলিয়ান
  • বিন্যাস
  • টাইপ করা অ্যারে
  • RegExp
  • ক্রিয়া
  • অন্য সমস্ত অবজেক্টে নির্মিত যা নতুন অপারেটর ব্যবহার করে নতুন অবজেক্ট তৈরি করতে পারে
  • ফাংশন ইউজারডিফাইনডফানশন () {/ * ব্যবহারকারীর সংজ্ঞায়িত কোড * /}

সুতরাং, টাইপফ (অবজেক্ট) === টাইপফ (স্ট্রিং) === টাইপফ (সংখ্যা) === টাইপফ (বুলিয়ান) === টাইপফ (অ্যারে) === টাইপফ (রেজিএক্সপ) === টাইপফ (ফাংশন) == = টাইপফ (ইউজারডিফাইন্ডফানশন) === 'ফাংশন'

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

var Object= new Function ([native code for object Object])
var String= new Function ([native code for object String])
var Number= new Function ([native code for object Number])
var Boolean= new Function ([native code for object Boolean])
var Array= new Function ([native code for object Array])
var RegExp= new Function ([native code for object RegExp])
var Function= new Function ([native code  for object Function])
var UserDefinedFunction= new Function ("user defined code")

উল্লিখিত হিসাবে, ফাংশন ধরণের অবজেক্টগুলি আরও নতুন অপারেটর ব্যবহার করে নতুন অবজেক্ট তৈরি করতে পারে । উদাহরণস্বরূপ , অবজেক্ট , স্ট্রিং , সংখ্যা , বুলিয়ান , অ্যারে , রেজএক্সপ বা ইউজারডাইফাইনড ফাংশন টাইপের একটি অবজেক্ট ব্যবহার করে তৈরি করা যেতে পারে

var a=new Object() or var a=Object() or var a={} //Create object of type Object
var a=new String() //Create object of type String
var a=new Number() //Create object of type Number
var a=new Boolean() //Create object of type Boolean
var a=new Array() or var a=Array() or var a=[]  //Create object of type Array
var a=new RegExp() or var a=RegExp() //Create object of type RegExp
var a=new UserDefinedFunction() 

বস্তু এইভাবে নির্মিত সব অ ফাংশন টাইপ বস্তু এবং তাদের আসতে typeof === 'অবজেক্ট' । এই সমস্ত ক্ষেত্রে "ক" অবজেক্টটি আরও নতুন অপারেটর ব্যবহার করে অবজেক্ট তৈরি করতে পারে না। সুতরাং নিম্নলিখিতটি ভুল

var b=new a() //error. a is not typeof==='function'

বস্তুর সালে নির্মিত গণিত হয় typeof === 'অবজেক্ট' । সুতরাং নতুন অপারেটর দ্বারা ম্যাথ টাইপের নতুন একটি অবজেক্ট তৈরি করা যায় না।

var b=new Math() //error. Math is not typeof==='function'

এছাড়াও লক্ষ্য করুন যে অবজেক্ট , অ্যারে এবং RegExp ফাংশনগুলি অপারেটরকে নতুন ব্যবহার না করেই একটি নতুন অবজেক্ট তৈরি করতে পারে । তবে ফলউইংগুলি এমন হয় না।

var a=String() // Create a new Non Object string. returns a typeof==='string' 
var a=Number() // Create a new Non Object Number. returns a typeof==='number'
var a=Boolean() //Create a new Non Object Boolean. returns a typeof==='boolean'

ব্যবহারকারীর সংজ্ঞায়িত ফাংশনগুলি বিশেষ ক্ষেত্রে।

var a=UserDefinedFunction() //may or may not create an object of type UserDefinedFunction() based on how it is defined.

যেহেতু ফাংশন ধরণের অবজেক্টগুলি নতুন অবজেক্ট তৈরি করতে পারে তাদের কনস্ট্রাক্টরও বলা হয় ।

প্রতিটি কনস্ট্রাক্টর / ফাংশন (অন্তর্নির্মিত বা ব্যবহারকারী সংজ্ঞায়িত) যখন স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত হয় তখন "প্রোটোটাইপ" নামক একটি সম্পত্তি থাকে যার ডিফল্টরূপে একটি মান হিসাবে সেট করা হয়। এই অবজেক্টটিতে নিজেই "কনস্ট্রাক্টর" নামে একটি সম্পত্তি রয়েছে যা ডিফল্টরূপে কনস্ট্রাক্টর / ফাংশনটিকে উল্লেখ করে ।

উদাহরণস্বরূপ যখন আমরা একটি ফাংশন সংজ্ঞায়িত করি

function UserDefinedFunction()
{
}

নিম্নলিখিত স্বয়ংক্রিয়ভাবে ঘটে

UserDefinedFunction.prototype={constructor:UserDefinedFunction}

এই "প্রোটোটাইপ" বৈশিষ্ট্যটি কেবল ফাংশন ধরণের অবজেক্টগুলিতে উপস্থিত থাকে (এবং কখনই নন-ফাংশন ধরণের অবজেক্টগুলিতে নয় )।

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

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

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

সমস্ত ফাংশন ধরণের অবজেক্টের জন্য কনস্ট্রাক্টর ফাংশন সর্বদা ফাংশন () { is

জন্য অ ফাংশন টাইপ বস্তু (যেমন জাভাস্ক্রিপ্ট ম্যাথ বস্তুর অন্তর্নির্মিত) কন্সট্রাকটর ফাংশন ফাংশন এটি তৈরি করেছেন। জন্য ম্যাথ বস্তুর এটা ফাংশন বস্তু () {}

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

function UserDefinedFunction()
{ 

} 

/* creating the above function automatically does the following as mentioned earlier

UserDefinedFunction.prototype={constructor:UserDefinedFunction}

*/


var newObj_1=new UserDefinedFunction()

alert(Object.getPrototypeOf(newObj_1)===UserDefinedFunction.prototype)  //Displays true

alert(newObj_1.constructor) //Displays function UserDefinedFunction

//Create a new property in UserDefinedFunction.prototype object

UserDefinedFunction.prototype.TestProperty="test"

alert(newObj_1.TestProperty) //Displays "test"

alert(Object.getPrototypeOf(newObj_1).TestProperty)// Displays "test"

//Create a new Object

var objA = {
        property1 : "Property1",
        constructor:Array

}


//assign a new object to UserDefinedFunction.prototype
UserDefinedFunction.prototype=objA

alert(Object.getPrototypeOf(newObj_1)===UserDefinedFunction.prototype)  //Displays false. The object referenced by UserDefinedFunction.prototype has changed

//The internal reference does not change
alert(newObj_1.constructor) // This shall still Display function UserDefinedFunction

alert(newObj_1.TestProperty) //This shall still Display "test" 

alert(Object.getPrototypeOf(newObj_1).TestProperty) //This shall still Display "test"


//Create another object of type UserDefinedFunction
var newObj_2= new UserDefinedFunction();

alert(Object.getPrototypeOf(newObj_2)===objA) //Displays true.

alert(newObj_2.constructor) //Displays function Array()

alert(newObj_2.property1) //Displays "Property1"

alert(Object.getPrototypeOf(newObj_2).property1) //Displays "Property1"

//Create a new property in objA
objA.property2="property2"

alert(objA.property2) //Displays "Property2"

alert(UserDefinedFunction.prototype.property2) //Displays "Property2"

alert(newObj_2.property2) // Displays Property2

alert(Object.getPrototypeOf(newObj_2).property2) //Displays  "Property2"

প্রতিটি বস্তুর প্রোটোটাইপ চেইন শেষ পর্যন্ত অবজেক্ট.প্রোটোটাইপ (যা নিজে কোনও প্রোটোটাইপ অবজেক্টে থাকে না) -এ ফিরে যায়। নিম্নলিখিত কোডটি কোনও সামগ্রীর প্রোটোটাইপ শৃঙ্খলার জন্য ব্যবহার করা যেতে পারে

var o=Starting object;

do {
    alert(o + "\n" + Object.getOwnPropertyNames(o))

}while(o=Object.getPrototypeOf(o))

বিভিন্ন বিষয়বস্তুর জন্য প্রোটোটাইপ চেইন নিম্নলিখিত হিসাবে কাজ করে।

  • প্রতিটি ফাংশন অবজেক্ট (ফাংশন অবজেক্টে অন্তর্নির্মিত) -> ফাংশন.প্রোটোটাইপ -> অবজেক্ট.প্রোটোটাইপ -> নাল
  • সরল অবজেক্টস (নতুন অবজেক্ট () দ্বারা তৈরি বা Math Math ম্যাথ অবজেক্টে অন্তর্ভুক্ত) -> অবজেক্ট.প্রোটোটাইপ -> নাল
  • নতুন বা অবজেক্ট.ক্রিয়েট -> এক বা একাধিক প্রোটোটাইপ চেইন -> অবজেক্ট.প্রোটোটাইপ -> নাল দিয়ে তৈরি করা বস্তু

কোনও প্রোটোটাইপ ছাড়াই কোনও অবজেক্ট তৈরি করার জন্য নিম্নলিখিতটি ব্যবহার করুন:

var o=Object.create(null)
alert(Object.getPrototypeOf(o)) //Displays null

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

function UserDefinedFunction(){}
UserDefinedFunction.prototype=null// Can be set to any non object value (number,string,undefined etc.)

var o=new UserDefinedFunction()
alert(Object.getPrototypeOf(o)==Object.prototype)   //Displays true
alert(o.constructor)    //Displays Function Object

এই নিবন্ধটির সংক্ষিপ্তসার অনুসরণ করা

  • দুটি ধরণের অবজেক্টস রয়েছে ফাংশন প্রকার এবং নন ফাংশন প্রকারগুলি
  • কেবল ফাংশন ধরণের অবজেক্টগুলি অপারেটরটিকে নতুন ব্যবহার করে একটি নতুন অবজেক্ট তৈরি করতে পারে । এইভাবে তৈরি করা বস্তুগুলি হ'ল নন ফাংশন ধরণের অবজেক্ট। অ ফাংশন টাইপ বস্তু আরও একটি বস্তু ব্যবহার তৈরি করা যাবে না অপারেটর নতুন

  • ডিফল্টরূপে সমস্ত ফাংশন ধরণের অবজেক্টের একটি "প্রোটোটাইপ" সম্পত্তি থাকে। এই "প্রোটোটাইপ" বৈশিষ্ট্যটি এমন একটি অবজেক্টের উল্লেখ করে যা "কনস্ট্রাক্টর" বৈশিষ্ট্যযুক্ত যা ডিফল্টরূপে ফাংশন টাইপ অবজেক্টটিকেই উল্লেখ করে।

  • সমস্ত অবজেক্টের ( ফাংশন টাইপ এবং নন ফাংশন প্রকারের ) একটি "কনস্ট্রাক্টর" বৈশিষ্ট্য রয়েছে যা ডিফল্টরূপে এটি তৈরি করা ফাংশন টাইপ অবজেক্ট / কনস্ট্রাক্টরের উল্লেখ করে ।

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

  • একটি বস্তুর প্রোটোটাইপ (এবং অত: পর তার উত্তরাধিকার হিসেবে প্রাপ্ত অবস্থায় বৈশিষ্টগুলির নাম) ব্যবহার করে পুনরায় উদ্ধার করা যাবে Object.getPrototypeOf () পদ্ধতি। আসলে এই পদ্ধতিটি অবজেক্টের পুরো প্রোটোটাইপ চেইন নেভিগেট করার জন্য ব্যবহার করা যেতে পারে।

  • প্রতিটি অবজেক্টের প্রোটোটাইপ চেইন শেষ পর্যন্ত অবজেক্ট.প্রোটোটাইপের দিকে ফিরে ট্রেস করে (অবজেক্ট ক্রিয়েট (নাল) ব্যবহার করে যদি অবজেক্টটি তৈরি না করা হয় যার ক্ষেত্রে বস্তুর কোনও প্রোটোটাইপ নেই)।

  • টাইপফ (নতুন অ্যারে ()) === 'অবজেক্ট' ভাষা ডিজাইনের দ্বারা এবং ডগলাস ক্রকফোর্ডের নির্দেশিত ভুল হিসাবে নয়

  • কনস্ট্রাক্টরের প্রোটোটাইপ বৈশিষ্ট্য নাল (বা অপরিজ্ঞাত, সংখ্যা, সত্য, মিথ্যা, স্ট্রিং) এ সেট করার ফলে নাল প্রোটোটাইপযুক্ত কোনও বস্তু তৈরি করা যাবে না। এই জাতীয় ক্ষেত্রে নতুন তৈরি করা অবজেক্টের প্রোটোটাইপ অবজেক্ট.প্রোটোটাইপতে সেট করা হয় এবং এর কনস্ট্রাক্টরটি অবজেক্টের কাজ করতে সেট করা হয়।

আশাকরি এটা সাহায্য করবে.


24

prototypalউত্তরাধিকারের ধারণাটি অনেক বিকাশকারীদের মধ্যে অন্যতম জটিল। prototypal inheritanceআরও ভাল করে বুঝতে সমস্যাটির মূলটি বোঝার চেষ্টা করা যাক । একটি plainফাংশন দিয়ে শুরু করা যাক ।

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

আমরা যদি newঅপারেটর ব্যবহার করি তবে আমরা Tree functionএটিকে একটি constructorফাংশন হিসাবে ডাকি ।

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

প্রতিটি JavaScriptফাংশন একটি আছে prototype। আপনি লগ ইন করার পরে Tree.prototype, আপনি পাবেন ...

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

আপনি যদি উপরের console.log()আউটপুটটি দেখে থাকেন তবে আপনি কোনও নির্মাণকারী সম্পত্তি Tree.prototypeএবং একটি __proto__সম্পত্তিও দেখতে পাচ্ছেন । __proto__প্রতিনিধিত্ব করে prototypeযে এই functionবন্ধ ভিত্তিক হয়, এবং যেহেতু এই মাত্র একটি প্লেইন হয় JavaScript functionসঙ্গে inheritanceএখনো সেট আপ, এটা বোঝায় Object prototypeযা কিছু ঠিক জাভাস্ক্রিপ্ট আগে থেকেই আছে ...

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

এর মতো জিনিস রয়েছে .toString, .toValue, .hasOwnProperty...

__proto__যা আমার মোজিলা আনা হয়েছিল তা হ্রাস করা হয় এবং তা Object.getPrototypeOfপাওয়ার জন্য পদ্ধতি দ্বারা প্রতিস্থাপন করা হয় object's prototype

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

Object.getPrototypeOf(Tree.prototype); // Object {} 

আমাদের একটি পদ্ধতি যুক্ত করুন Tree prototype

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

আমরা এর পরিবর্তন করেছি Rootএবং এর সাথে একটি functionশাখা যুক্ত করেছি।

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

মানে যখন আপনি একটি তৈরি যে instanceএর Tree, আপনি এটি এর কল করতে পারেন branchপদ্ধতি।

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

আমরা আমাদের যোগ করতে primitivesবা objectsকরতে পারেন Prototype

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

আসুন child-treeআমাদের একটি যোগ করুন Tree

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

এখানে গাছ থেকে Childউত্তরাধিকার সূত্রে প্রাপ্ত prototype, আমরা এখানে যা করছি Object.create()তা আপনি যা পাস তা বন্ধ করে একটি নতুন অবজেক্ট তৈরি করার পদ্ধতি ব্যবহার করছে , এটি এখানে Tree.prototype। এক্ষেত্রে আমরা যা করছি তা হ'ল চাইল্ডের প্রোটোটাইপটি একটি নতুন অবজেক্টে সেট করা যা প্রোটোটাইপের সাথে অভিন্ন দেখায় Tree। পরবর্তী আমরা সেট করছি Child's constructor to Child, যদি আমরা এটি নির্দেশ না করে Tree()

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

Childএখন এর নিজস্ব আছে prototype, এর __proto__পয়েন্ট রয়েছে Treeএবং Tree's prototypeবেসে পয়েন্ট করবে Object

Child  
|
 \
  \
   Tree.prototype
   - branch
   |
   |
    \
     \
      Object.prototype
      -toString
      -valueOf
      -etc., etc.

এখন আপনি একটি instanceঅফ Childএবং কল তৈরি করেন branchযা মূলত উপলভ্য Tree। আমরা আসলে আমাদের সংজ্ঞায়িত করেন নি branchউপর Child prototype। কিন্তু Root prototypeবাচ্চা যার কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।

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

জেএসে সমস্ত কিছুই কোনও বস্তু নয়, সবকিছুই কোনও বস্তুর মতো কাজ করতে পারে।

Javascriptstrings, number, booleans, undefined, null.তারা যেমন না আদিম রয়েছে object(i.e reference types), তবে অবশ্যই এটির মতো কাজ করতে পারে object। আসুন এখানে একটি উদাহরণ তাকান।

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

এই তালিকার প্রথম লাইনে একটি primitiveস্ট্রিং মান নামের জন্য বরাদ্দ করা হয়েছে। দ্বিতীয় লাইনটি নামের মতো আচরণ করে objectএবং charAt(0)ডট নোটেশন ব্যবহার করে কল করে।

পর্দার আড়ালে এটিই ঘটে: // JavaScriptইঞ্জিন কী করে

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

String objectশুধুমাত্র এক বিবৃতিতে বিদ্যমান আগেই (ক প্রক্রিয়া নামক ধ্বংস হচ্ছে autoboxing)। আবার আমাদের কাছে ফিরে আসতে দিন prototypal inheritance

  • Javascriptdelegationভিত্তিক মাধ্যমে উত্তরাধিকার সমর্থন করে prototypes
  • প্রত্যেকের Functionএকটি prototypeসম্পত্তি আছে, যা অন্য একটি বস্তুকে বোঝায়।
  • properties/functionsএটি উপস্থিত না থাকলে objectনিজে থেকে বা prototypeচেইনের মাধ্যমে দেখানো হয়

একটি prototypeজাতীয় যা একটি বস্তুর yieldsআপনি অন্য অভিভাবক করতে object[অর্থাত্ .. প্রতিনিধি] এর Delegation অর্থ হ'ল আপনি যদি কিছু করতে অক্ষম হন তবে আপনি অন্য কাউকে এটি করার জন্য বলবেন।

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

https://jsfiddle.net/say0tzpL/1/

আপনি যদি উপরের ফিডলটি সন্ধান করেন তবে কুকুরের toStringপদ্ধতিতে অ্যাক্সেস রয়েছে তবে এটি এতে পাওয়া যায় না তবে প্রোটোটাইপ চেইনের মাধ্যমে উপলব্ধ যা প্রতিনিধিত্ব করেObject.prototype

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

আপনি নীচের দিকে তাকান, আমরা প্রতিটি যে callপদ্ধতিতে উপলব্ধ তা অ্যাক্সেস করার চেষ্টা করছি function

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

https://jsfiddle.net/rknffckc/

আপনি যদি উপরের ফিডলটি সন্ধান করেন তবে ফাংশনটির পদ্ধতিতে Profileঅ্যাক্সেস রয়েছে callতবে এটি এতে পাওয়া যায় না তবে প্রোটোটাইপ চেইনের মাধ্যমে উপলব্ধ যা প্রতিনিধিত্ব করেFunction.prototype

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

নোট: prototype ফাংশন কনস্ট্রাক্টরের __proto__একটি সম্পত্তি , যেখানে ফাংশন কনস্ট্রাক্টর থেকে নির্মিত বস্তুর সম্পত্তি। প্রতিটি ফাংশন এমন একটি prototypeসম্পত্তি নিয়ে আসে যার মান শূন্য object। আমরা যখন ফাংশনের একটি দৃষ্টান্ত তৈরি করেন, আমরা একটি অভ্যন্তরীণ সম্পত্তি পেতে [[Prototype]]বা __proto__যার রেফারেন্স ফাংশন এর প্রোটোটাইপ হয় constructor

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

উপরের চিত্রটি কিছুটা জটিল দেখায় তবে কীভাবে prototype chainingকাজ করে তার পুরো চিত্রটি সামনে এনেছে । আসুন ধীরে ধীরে এটি দিয়ে চলুন:

দুই উদাহরণস্বরূপ আছে b1এবং b2যার কন্সট্রাকটর হয় Barএবং পিতা বা মাতা ফু এবং প্রোটোটাইপ শৃঙ্খল থেকে দুটি পদ্ধতি রয়েছে identifyএবং speakএর মাধ্যমে BarএবংFoo

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

https://jsfiddle.net/kbp7jr7n/

আপনি যদি উপরের কোডটি সন্ধান করেন তবে আমাদের কাছে এমন Fooকন্সট্রাক্টর রয়েছে যার পদ্ধতি রয়েছে identify()এবং Barকন্সট্রাক্টর রয়েছে speak। আমরা দুটি Barদৃষ্টান্ত তৈরি করি b1এবং b2যার পিতামাতার ধরণ Foo। এখন কল করার speakপদ্ধতিটি করার সময় Bar, আমরা কে prototypeশৃঙ্খলার মাধ্যমে স্পিকারটি ডাকছে তা সনাক্ত করতে সক্ষম হয়েছি ।

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

Barএখন এর সমস্ত পদ্ধতি রয়েছে Fooযার মধ্যে এটি সংজ্ঞায়িত হয়েছে prototype। এর বুঝতে আরও খনন করা যাক Object.prototypeএবং Function.prototypeএবং কিভাবে সম্পর্কিত হয়। আপনি যদি নির্মাণকারীর সন্ধান করেন Foo, Barএবং Objectহয় Function constructor

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

prototypeএর Barহয় Foo, prototypeএর Fooহয় Objectএবং যদি আপনি ঘনিষ্ঠভাবে চেহারা prototypeএর Fooসঙ্গে সম্পর্কযুক্ত Object.prototype

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

এটি বন্ধ করার আগে, উপরের সমস্ত কিছুর সংক্ষিপ্ত বিবরণ জানাতে এখানে কোডের একটি ছোট টুকরা দিয়ে গুটিয়ে রাখি । আমরা ব্যবহার করছেন instanceofএকটি কিনা তা যাচাই করতে এখানে অপারেটর objectতার আছে prototypeশৃঙ্খল prototypeএকটি সম্পত্তির constructorযার নীচে সমগ্র বড় ডায়াগ্রাম সংক্ষিপ্ত বিবরণ।

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

আমি আশা করি এই অ্যাডের কিছু তথ্য রয়েছে, আমি জানি এই ধরণের গ্রন্থটি উপলব্ধি করা বড় হতে পারে ... সাধারণ কথায় এটি কেবলমাত্র বস্তুর সাথে যুক্ত যুক্তিযুক্ত !!!!


22

এই ".প্রোটোটাইপ" সম্পত্তিটির সঠিক উদ্দেশ্য কী?

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

প্রোটোটাইপগুলিকে অতিরিক্ত ভিটিবেল-পয়েন্টার হিসাবে ভাবেন। কিছু সদস্য যখন আসল ক্লাস থেকে নিখোঁজ হন, তখন প্রোটোটাইপটি রানটাইমটিতে সন্ধান করা হয়।


21

এটি প্রোটোটাইপ চেইনগুলিকে দুটি বিভাগে শ্রেণিবদ্ধ করতে সহায়তা করতে পারে।

নির্মাতা বিবেচনা করুন:

 function Person() {}

এর মান Object.getPrototypeOf(Person)একটি ফাংশন। আসলে, এটা হয় Function.prototype। যেহেতু Personএকটি ফাংশন হিসাবে তৈরি করা হয়েছিল, তাই এটি সমস্ত ফাংশনগুলির মতো একই প্রোটোটাইপ ফাংশন ভাগ করে। এটি একইরকম Person.__proto__, তবে সেই সম্পত্তি ব্যবহার করা উচিত নয়। যাইহোক, আপনার সাথে Object.getPrototypeOf(Person)কার্যকরভাবে সিঁড়িটি হাঁটা যা প্রোটোটাইপ চেইন বলে।

Wardর্ধ্বমুখী দিকের চেইনটি দেখতে এরকম দেখাচ্ছে:

    PersonFunction.prototypeObject.prototype(শেষ পয়েন্ট)

গুরুত্বপূর্ণ এই প্রোটোটাইপ শৃঙ্খল সামান্য যে বস্তু কি আছে যে Personকরতে গঠন করা । এই নির্মাণকৃত বস্তুর নিজস্ব প্রোটোটাইপ চেইন রয়েছে এবং এই চেইনটি উপরে বর্ণিত একটির সাথে সম্ভবত কোনও ঘনিষ্ঠ পূর্বপুরুষ থাকতে পারে না।

উদাহরণস্বরূপ এই অবজেক্টটি ধরুন:

var p = new Person();

পি এর কোনও ব্যক্তির সাথে সরাসরি প্রোটোটাইপ-চেইন সম্পর্ক নেই । তাদের সম্পর্ক এক অন্যরকম। অবজেক্ট পি এর নিজস্ব প্রোটোটাইপ চেইন রয়েছে। ব্যবহার করে Object.getPrototypeOf, আপনি নিম্নলিখিতটি চেইনটি দেখতে পাবেন:

    pPerson.prototypeObject.prototype(শেষ পয়েন্ট)

এই চেইনে কোনও ফাংশন অবজেক্ট নেই (যদিও এটি হতে পারে)।

তাই Personমনে হয় দুই ধরণের চেইনের সাথে সম্পর্কিত যা তাদের নিজস্ব জীবন যাপন করে। একটি চেইন থেকে অন্য শৃঙ্খলে "জাম্প" করতে, আপনি ব্যবহার করুন:

  1. .prototype: নির্মিত-বস্তুর চেইনে কনস্ট্রাক্টরের চেইন থেকে লাফিয়ে। এই সম্পত্তিটি কেবলমাত্র ফাংশন অবজেক্টের জন্য সংজ্ঞায়িত হয় ( newকেবলমাত্র ফাংশনগুলিতে ব্যবহৃত হতে পারে)।

  2. .constructor: তৈরি-অবজেক্টের চেইন থেকে কনস্ট্রাক্টরের শৃঙ্খলে ঝাঁপ দাও।

জড়িত দুটি প্রোটোটাইপ চেইনের একটি দৃশ্য উপস্থাপনা এখানে কলাম হিসাবে উপস্থাপন করা হয়েছে:

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

সংক্ষেপ:

prototypeসম্পত্তির কোন তথ্য দেয় বিষয়ের প্রোটোটাইপ শৃঙ্খল, কিন্তু বস্তুর দ্বারা নির্মিত বিষয়।

সম্পত্তিটির নাম prototypeবিভ্রান্তির কারণ হতে পারে এতে অবাক হওয়ার কিছু নেই । এই সম্পত্তির নাম prototypeOfConstructedInstancesবা সেই লাইন বরাবর কিছু লেখা থাকলে এটি আরও পরিষ্কার হত ।

দুটি প্রোটোটাইপ চেইনের মধ্যে আপনি পিছনে পিছনে লাফিয়ে যেতে পারেন:

Person.prototype.constructor === Person

এই প্রতিসাম্যটি prototypeসম্পত্তিতে স্পষ্টভাবে একটি আলাদা অবজেক্ট বরাদ্দ করে ভেঙে ফেলা যেতে পারে (আরও পরে এটি সম্পর্কে)।

একটি ফাংশন তৈরি করুন, দুটি বস্তু পান

Person.prototypeএটি এমন একটি বস্তু যা একই সময়ে ফাংশনটি Personতৈরি করা হয়েছিল। এটির Personকনস্ট্রাক্টর হিসাবে রয়েছে , যদিও নির্মাণকারী এখনও কার্যকর করেনি ute সুতরাং একই সাথে দুটি বস্তু তৈরি করা হয়:

  1. ফাংশন Personনিজেই
  2. ফাংশনটি যখন কনস্ট্রাক্টর হিসাবে ডাকা হয় তখন অবজেক্টটি প্রোটোটাইপ হিসাবে কাজ করবে

উভয় বস্তু, তবে তাদের বিভিন্ন ভূমিকা রয়েছে: ফাংশন অবজেক্টটি নির্মাণ করে , অন্য বস্তুটি যে কোনও অবজেক্টের প্রোটোটাইপকে উপস্থাপন করে যা ফাংশনটি নির্মাণ করবে will প্রোটোটাইপ অবজেক্ট তার প্রোটোটাইপ শৃঙ্খলে নির্মিত অবজেক্টের পিতামাত্রে পরিণত হবে।

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

এখানে কিছু সমতা যা সমস্যাটি বুঝতে সহায়তা করতে পারে - এই সমস্ত মুদ্রণ true:

function Person() {};

// This is prototype chain info for the constructor (the function object):
console.log(Object.getPrototypeOf(Person) === Function.prototype);
// Step further up in the same hierarchy:
console.log(Object.getPrototypeOf(Function.prototype) === Object.prototype);
console.log(Object.getPrototypeOf(Object.prototype) === null);
console.log(Person.__proto__ === Function.prototype);
// Here we swap lanes, and look at the constructor of the constructor
console.log(Person.constructor === Function);
console.log(Person instanceof Function);

// Person.prototype was created by Person (at the time of its creation)
// Here we swap lanes back and forth:
console.log(Person.prototype.constructor === Person);
// Although it is not an instance of it:
console.log(!(Person.prototype instanceof Person));
// Instances are objects created by the constructor:
var p = new Person();
// Similarly to what was shown for the constructor, here we have
// the same for the object created by the constructor:
console.log(Object.getPrototypeOf(p) === Person.prototype);
console.log(p.__proto__ === Person.prototype);
// Here we swap lanes, and look at the constructor
console.log(p.constructor === Person);
console.log(p instanceof Person);

প্রোটোটাইপ চেইনে স্তর যুক্ত করা

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

এই ক্ষেত্রে:

function Thief() { }
var p = new Person();
Thief.prototype = p; // this determines the prototype for any new Thief objects:
var t = new Thief();

টি এর প্রোটোটাইপ চেইন পি এর চেয়ে এক ধাপ বেশি :

    tpPerson.prototypeObject.prototype(শেষ পয়েন্ট)

অন্য প্রোটোটাইপ চেইনটি আর নয়: Thiefএবং Personভাইবোনরা তাদের প্রোটোটাইপ চেইনে একই পিতামাতাকে ভাগ করছে:

    Person}
    Thief  } → Function.prototypeObject.prototype(শেষ পয়েন্ট)

পূর্বে উপস্থাপিত গ্রাফিকটি এর পরে প্রসারিত করা যেতে পারে (মূলটি Thief.prototypeবাদ পড়ে):

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

নীল লাইনগুলি প্রোটোটাইপ চেইনগুলি উপস্থাপন করে, অন্যান্য বর্ণযুক্ত রেখাগুলি অন্য সম্পর্কের প্রতিনিধিত্ব করে:

  • একটি বস্তু এবং এটির নির্মাণকারীর মধ্যে between
  • কনস্ট্রাক্টর এবং প্রোটোটাইপ অবজেক্টের মধ্যে যা অবজেক্ট তৈরির জন্য ব্যবহৃত হবে

18

অবজেক্ট-ওরিয়েন্টেড জাভাস্ক্রিপ্টের সংজ্ঞা নির্দেশিকা - একটি খুব সংক্ষিপ্ত এবং পরিষ্কার the 30 মিনিটের জিজ্ঞাসিত প্রশ্নের ভিডিও ব্যাখ্যা (প্রোটোটাইপাল হেরিটাইজেন্স বিষয়টি 5:45 থেকে শুরু হয় , যদিও আমি পুরো ভিডিওটি শুনতে চাই)। এই ভিডিওটির লেখক জাভাস্ক্রিপ্ট অবজেক্ট ভিজ্যুয়ালাইজার ওয়েবসাইট http://www.objectplayground.com/ করেছেনএখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


1
দুর্দান্ত ভিডিও রেফারেন্স
10:58

16

"প্রোটোটাইপ চেইন "টিকে পুনরাবৃত্ত কনভেনশন হিসাবে ব্যাখ্যা করার সময় আমি সহায়ক obj_n.prop_Xবলে মনে করেছি:

যদি obj_n.prop_Xউপস্থিত না থাকে, obj_n+1.prop_Xকোথায় তা পরীক্ষা করুনobj_n+1 = obj_n.[[prototype]]

যদি prop_Xশেষ পর্যন্ত কে-থ্র প্রোটোটাইপ অবজেক্টে পাওয়া যায়

obj_1.prop_X = obj_1.[[prototype]].[[prototype]]..(k-times)..[[prototype]].prop_X

আপনি জাভাস্ক্রিপ্ট অবজেক্টগুলির সম্পর্কের একটি গ্রাফ তাদের সম্পত্তি হিসাবে এখানে পেতে পারেন:

জেএস বস্তু গ্রাফ

http://jsobjects.org


14

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


11

এখানে দুটি স্বতন্ত্র তবে সম্পর্কিত সত্ত্বা রয়েছে যার ব্যাখ্যা দেওয়া দরকার:

  • দ্য .prototypeফাংশন সম্পত্তি।
  • [[Prototype]][1] সমস্ত বস্তুর সম্পত্তি [2]

এই দুটি ভিন্ন জিনিস।

দ্য [[Prototype]]সম্পত্তি:

এটি এমন একটি সম্পত্তি যা সকলের উপর বিদ্যমান [২] অবজেক্টে ।

এখানে যা সঞ্চিত তা হ'ল আরেকটি অবজেক্ট, যা একটি অবজেক্ট হিসাবে নিজেই [[Prototype]]এর নিজস্ব একটি যা অন্য কোনও বস্তুর দিকে নির্দেশ করে। অন্য বস্তুর নিজস্ব একটি রয়েছে [[Prototype]]of আপনি এই প্রোটোটাইপিকাল অবজেক্টে পৌঁছা অবধি এই গল্পটি অব্যাহত থাকে যা এমন সমস্ত পদ্ধতির (যেমন পছন্দ করে এমন পদ্ধতিগুলি সরবরাহ করে).toString ) ।

[[Prototype]]সম্পত্তি কি ফর্ম অংশ [[Prototype]]শৃঙ্খল। [[Prototype]]বস্তুর এই শৃঙ্খলাটি যা যখন পরীক্ষা করা হয়, উদাহরণস্বরূপ, [[Get]]বা [[Set]]কোনও বস্তুর উপর ক্রিয়াকলাপ করা হয়:

var obj = {}
obj.a         // [[Get]] consults prototype chain
obj.b = 20    // [[Set]] consults prototype chain

.prototypeসম্পত্তি:

এটি এমন একটি সম্পত্তি যা কেবল ফাংশনে পাওয়া যায়। খুব সাধারণ ফাংশন ব্যবহার করা:

function Bar(){};

.prototypeসম্পত্তি একটি বস্তু ঝুলিতে যে নির্ধারিত হবে b.[[Prototype]]যখন আপনি কি করতে var b = new Bar। আপনি সহজেই এটি পরীক্ষা করতে পারেন:

// Both assign Bar.prototype to b1/b2[[Prototype]]
var b = new Bar;
// Object.getPrototypeOf grabs the objects [[Prototype]]
console.log(Object.getPrototypeOf(b) === Bar.prototype) // true

সবচেয়ে গুরুত্বপূর্ণ এক .prototypeগুলি করে এর Objectফাংশন । এই প্রোটোটাইপটি সমস্ত [[Prototype]]চেইনগুলিতে থাকা প্রোটোটাইপিকাল অবজেক্টকে ধারণ করে। এটিতে, নতুন অবজেক্টের জন্য সমস্ত উপলব্ধ পদ্ধতি সংজ্ঞায়িত করা হয়:

// Get properties that are defined on this object
console.log(Object.getOwnPropertyDescriptors(Object.prototype))

এখন যেহেতু .prototypeএকটি বস্তু তাই এর একটি [[Prototype]]সম্পত্তি রয়েছে। আপনাকে কোনো বরাদ্দকরণ না যখন Function.prototype, .prototypeএর [[Prototype]]prototypical এর বস্তু পয়েন্ট (Object.prototype )। আপনি কোনও নতুন ফাংশন তৈরির সময় এটি স্বয়ংক্রিয়ভাবে সঞ্চালিত হয়।

এভাবে আপনি যে কোনও সময় new Bar;প্রোটোটাইপ চেইন সেট আপ করবেন, আপনি যা কিছুতে সংজ্ঞায়িত করেছেন Bar.prototypeএবং সবকিছুতে এটি সংজ্ঞায়িত করেছেন Object.prototype:

var b = new Bar;
// Get all Bar.prototype properties
console.log(b.__proto__ === Bar.prototype)
// Get all Object.prototype properties
console.log(b.__proto__.__proto__ === Object.prototype)

তুমি কখন কি করতে বরাদ্দকরণFunction.prototype সব করছ প্রোটোটাইপ শৃঙ্খল ব্যাপ্ত অন্য বস্তুর অন্তর্ভুক্ত করা হয়। এটি এককভাবে সংযুক্ত তালিকায় সন্নিবেশের মতো

এটি মূলত [[Prototype]]চেইনকে অনুমতি দেয় এমন বৈশিষ্ট্যগুলিকে পরিবর্তিত Function.prototypeকরে যা ফাংশন দ্বারা নির্মিত কোনও বস্তুর দ্বারা দেখাতে নির্ধারিত বস্তুর উপরে সংজ্ঞায়িত হয় ।


[1: এটি কাউকে বিভ্রান্ত করবে না; মাধ্যমে উপলব্ধ সম্পত্তি অনেক বাস্তবায়নের হবে। __proto__
[2]: সমস্ত ছাড়া null


10

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

প্রোটোটাইপ একটি মডেলের মতো, যার ভিত্তিতে আপনি একটি পণ্য তৈরি করেন। বোঝার জন্য গুরুত্বপূর্ণ বিষয়টি হ'ল আপনি যখন অন্য কোনও অবজেক্টটিকে প্রোটোটাইপ হিসাবে ব্যবহার করেন তখন প্রোটোটাইপ এবং পণ্যের মধ্যে লিঙ্কটি স্থায়ী হয়। এই ক্ষেত্রে:

var model = {x:2};
var product = Object.create(model);
model.y = 5;
product.y
=>5

প্রতিটি বস্তুতে [[প্রোটোটাইপ]] নামক একটি অভ্যন্তরীণ সম্পত্তি থাকে যা Object.getPrototypeOf()ফাংশনটি দ্বারা অ্যাক্সেস করা যায় । Object.create(model)একটি নতুন অবজেক্ট তৈরি করে এবং তার [[প্রোটোটাইপ]] সম্পত্তিটি বস্তুর মডেলটিতে সেট করে । অতএব আপনি যখন করবেন Object.getPrototypeOf(product), আপনি বস্তুর মডেল পাবেন

পণ্যটির বৈশিষ্ট্যগুলি নিম্নলিখিত উপায়ে পরিচালনা করা হয়:

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

প্রোটোটাইপ সম্পত্তি ব্যবহার করে এমন সামগ্রীর সংযোগকে প্রোটোটাইপাল উত্তরাধিকার বলে। সেখানে, এটা এত সহজ, একমত?


অ্যাসাইনমেন্টের ক্ষেত্রে সর্বদা লিখিত থাকে না। আপনি এটি খুব পরিষ্কার করে বলছেন না যে উদাহরণস্বরূপ নির্দিষ্ট সদস্যদের শুরু করতে হবে এবং ভাগ করা সদস্যরা প্রোটোটাইপটিতে যেতে পারেন। বিশেষত যখন আপনার নির্দিষ্ট পরিবর্তনীয় সদস্য রয়েছে: স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি

এইচএমআর: আপনার উত্তরের উদাহরণে, ben.food.push ("হামবুর্গ"); লাইন নিম্নলিখিত কারণে প্রোটোটাইপ অবজেক্টের সম্পত্তি পরিবর্তিত করে: 1.) প্রথম ben.food সন্ধান করা হয়, এবং যে কোনও অনুসন্ধান ক্রিয়াকলাপ কেবল স্কোপ চেইনে অনুসন্ধান করবে। ২) that বেন.ফুড অবজেক্টের পুশ ফাংশনটি কার্যকর হয়। আমার উত্তরে মোড লিখে আমার অর্থ আপনি যখন স্পষ্টভাবে এর জন্য একটি মান সেট করেন, যেমন: ben.food = ['idly']; এটি পণ্য সামগ্রীতে সর্বদা একটি নতুন সম্পত্তি তৈরি করবে (যদি ইতিমধ্যে না থাকে) এবং তারপরে এটির মান নির্ধারণ করে।
অরবিন্দ

এইচএমআর: আপনার মন্তব্যের জন্য ধন্যবাদ, এটি আমাকে আমার বোধগম্য ভাবতে এবং পরীক্ষা করতে বাধ্য করে।
অরবিন্দ

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

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


10

নিম্নলিখিত keyValueStoreবিষয় বিবেচনা করুন :

var keyValueStore = (function() {
    var count = 0;
    var kvs = function() {
        count++;
        this.data = {};
        this.get = function(key) { return this.data[key]; };
        this.set = function(key, value) { this.data[key] = value; };
        this.delete = function(key) { delete this.data[key]; };
        this.getLength = function() {
            var l = 0;
            for (p in this.data) l++;
            return l;
        }
    };

    return  { // Singleton public properties
        'create' : function() { return new kvs(); },
        'count' : function() { return count; }
    };
})();

আমি এটি করে এই বস্তুর একটি নতুন উদাহরণ তৈরি করতে পারি:

kvs = keyValueStore.create();

এই অবজেক্টের প্রতিটি উদাহরণে নিম্নলিখিত সর্বজনীন বৈশিষ্ট্য থাকবে:

  • data
  • get
  • set
  • delete
  • getLength

এখন, ধরুন আমরা এই keyValueStoreবস্তুর 100 টি উদাহরণ তৈরি করি । যদিও get, set, delete, getLengthএই 100 দৃষ্টান্ত প্রত্যেকের জন্য সঠিক একই জিনিস করব প্রতিটি উদাহরণের এই ফাংশন তার নিজস্ব কপি আছে।

এখন, কল্পনা যদি আপনি কেবলমাত্র একটি হতে পারে get, set, deleteএবং getLengthকপি, এবং প্রতিটি উদাহরণ হিসেবে বলা যায় যে একই ফাংশন রেফারেন্স হবে। এটি পারফরম্যান্সের জন্য ভাল এবং কম স্মৃতি দরকার require

প্রোটোটাইপগুলি এখানে আসে A সুতরাং এর অর্থ হ'ল এটি কোনও বস্তুর সমস্ত দৃষ্টান্তের জন্য মেমরির মধ্যে একবারে উপস্থিত থাকে এবং সেই সমস্ত দৃষ্টান্তগুলি ভাগ করে নেওয়া হয়।

এখন, বিষয়টি keyValueStoreআবার বিবেচনা করুন । আমি এটি আবার লিখতে পারে:

var keyValueStore = (function() {
    var count = 0;
    var kvs = function() {
        count++;
        this.data = {};
    };

    kvs.prototype = {
        'get' : function(key) { return this.data[key]; },
        'set' : function(key, value) { this.data[key] = value; },
        'delete' : function(key) { delete this.data[key]; },
        'getLength' : function() {
            var l = 0;
            for (p in this.data) l++;
            return l;
        }
    };

    return  {
        'create' : function() { return new kvs(); },
        'count' : function() { return count; }
    };
})();

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


9

সারসংক্ষেপ:

  • ফাংশনগুলি জাভাস্ক্রিপ্টে অবজেক্ট এবং এতে বৈশিষ্ট্য থাকতে পারে
  • (কনস্ট্রাক্টর) ফাংশনে সর্বদা একটি প্রোটোটাইপ সম্পত্তি থাকে
  • কীওয়ার্ডের সাহায্যে কোনও ফাংশন কনস্ট্রাক্টর হিসাবে ব্যবহৃত newহলে অবজেক্টটি প্রোটোটাইপ পায়। এই প্রোটোটাইপের একটি রেফারেন্স __proto__সদ্য নির্মিত বস্তুর সম্পত্তিতে পাওয়া যাবে ।
  • এই __proto__সম্পত্তিটি prototypeকনস্ট্রাক্টর ফাংশনের সম্পত্তিকে বোঝায় ।

উদাহরণ:

function Person (name) {
  this.name = name;
}

let me = new Person('willem');

console.log(Person.prototype) // Person has a prototype property

console.log(Person.prototype === me.__proto__) // the __proto__ property of the instance refers to prototype property of the function.

কেন এই দরকারী:

জাভাস্ক্রিপ্টের এমন একটি প্রক্রিয়া রয়েছে যখন অবজেক্টগুলিতে সম্পত্তিগুলি অনুসন্ধান করা হয় যাকে বলা হয় 'প্রোটোটাইপাল উত্তরাধিকার' , মূলত যা করা হয় তা এখানে:

  • সম্পত্তিটি বস্তুর মধ্যেই অবস্থিত কিনা তা আগে পরীক্ষা করা হয়। যদি তাই হয় এই সম্পত্তি ফেরত দেওয়া হয়।
  • সম্পত্তি যদি কোনও বস্তুর উপরে না থাকে তবে এটি 'প্রোটোকেইন উপরে উঠবে'। এটি মূলত প্রোটো সম্পত্তি দ্বারা উল্লিখিত বস্তুর দিকে নজর দেয়প্রোটো দ্বারা উল্লিখিত বস্তুর উপর সম্পত্তি উপলব্ধ কিনা তা সেখানে পরীক্ষা করে
  • যদি সম্পত্তিটি প্রোটো অবজেক্টে অবস্থিত না হয় তবে এটি প্রজেক্ট অবজেক্ট অবধি প্রোটো চেইনে উঠে যাবে ।
  • যদি এটি সম্পত্তি এবং এর প্রোটোটাইপ শৃঙ্খলে কোথাও খুঁজে না পায় তবে এটি অপরিবর্তিত থাকবে।

উদাহরণ স্বরূপ:

function Person(name) {
  this.name = name;
}

let mySelf = new Person('Willem');

console.log(mySelf.__proto__ === Person.prototype);

console.log(mySelf.__proto__.__proto__ === Object.prototype);

হালনাগাদ:

__proto__সম্পত্তি, অবচিত হয়েছে যদিও এটি এটি অত্যাধুনিক ব্রাউজারে প্রোটোটাইপ অবজেক্ট রেফারেন্স প্রাপ্ত হবে একটি ভাল উপায় বাস্তবায়িত হয়:

Object.getPrototypeOf()


7

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

এটি কল্পনা করুন ....

আপনি হাই-স্কুলে রয়েছেন, এবং আপনি ক্লাসে রয়েছেন এবং আজই একটি কুইজ রয়েছে যা আপনার কাছে রয়েছে তবে উত্তরগুলি পূরণ করার জন্য আপনার কাছে কোনও কলম নেই। ডোহ!

আপনি আপনার বন্ধু ফিনিয়াসের পাশে বসে আছেন, যার কলম থাকতে পারে। আপনি জিজ্ঞাসা করুন, এবং তিনি তার ডেস্কটির আশেপাশে ব্যর্থতার সাথে তাকাচ্ছেন, তবে "আমার কাছে কলম নেই" বলার পরিবর্তে তিনি একটি দুর্দান্ত বন্ধু তিনি কলম থাকলে তার অন্য বন্ধু ডের্পের সাথে চেক করেন। ডার্পের প্রকৃতপক্ষে একটি অতিরিক্ত কলম রয়েছে এবং এটি ফিনিয়াসের কাছে ফিরিয়ে দেয়, যিনি এটি আপনার ক্যুইজটি শেষ করতে আপনার কাছে পাঠিয়ে দেন। ডার্প ফিনিয়াসের হাতে কলমটি অর্পণ করেছেন, যিনি আপনাকে কলমের ব্যবহারের জন্য অর্পণ করেছেন।

এখানে গুরুত্বপূর্ণ বিষয় হ'ল ডের্প আপনাকে কলম দেয় না, কারণ তার সাথে আপনার সরাসরি সম্পর্ক নেই

এটি, প্রোটোটাইপগুলি কীভাবে কাজ করে তার একটি সরল উদাহরণ, যেখানে আপনি যে জিনিসটির জন্য অনুসন্ধান করছেন তার জন্য ডেটা গাছের অনুসন্ধান করা হয়।


3

আরেকটি স্কিম __প্রোট__ , প্রোটোটাইপ এবং নির্মাণকারীর সম্পর্ক দেখায় : এখানে চিত্র বর্ণনা লিখুন


1

এটি ঠিক যে আপনার ইতিমধ্যে একটি অবজেক্ট রয়েছে Object.newতবে কনস্ট্রাক্টর সিনট্যাক্স ব্যবহার করার সময় আপনার এখনও কোনও অবজেক্ট নেই।


1

এটি বুঝতে গুরুত্বপূর্ণ যে কোনও অবজেক্টের প্রোটোটাইপ (যা মাধ্যমে Object.getPrototypeOf(obj)বা অবচিত __proto__সম্পত্তি দ্বারা উপলব্ধ) এবং prototypeকনস্ট্রাক্টর ফাংশনগুলির সম্পত্তি মধ্যে পার্থক্য রয়েছে । পূর্ববর্তী প্রতিটি উদাহরণের সম্পত্তি এবং পরেরটি হল কনস্ট্রাক্টরের সম্পত্তি। যে Object.getPrototypeOf(new Foobar())হিসাবে একই বস্তু বোঝায় Foobar.prototype

তথ্যসূত্র: https://developer.mozilla.org/en-US/docs/Learn/ জাভা স্ক্রিপ্ট / ওবজেক্টস / অবজেক্ট_প্রোটোটাইপস


0

প্রোটোটাইপ তৈরি করে নতুন অবজেক্ট বিদ্যমান ক্লোন করে বস্তুর । সুতরাং প্রকৃতপক্ষে যখন আমরা প্রোটোটাইপ সম্পর্কে চিন্তা করি তখন আমরা সত্যিই ক্লোনিং বা কোনও কিছু তৈরি করার পরিবর্তে তার একটি অনুলিপি ভাবতে পারি ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.