জাভাস্ক্রিপ্টে 'প্রোটোটাইপ' বনাম 'এই' ব্যবহার করবেন?


776

এর মধ্যে পার্থক্য কী

var A = function () {
    this.x = function () {
        //do something
    };
};

এবং

var A = function () { };
A.prototype.x = function () {
    //do something
};


এই কীওয়ার্ডটির ধারণাটি এখানে স্পষ্টভাবে ব্যাখ্যা করা হয়েছে scotch.io/@alZami/ बुझ বোঝার
-এ-

1
"এই" থ্রেডটি পড়লে বোঝা যায় যে জেএস কতটা ভয়ঙ্কর এবং এর নীতিগুলি অনেক বিকাশকারীদের কাছে কতটা অস্পষ্ট। সহজ ভাষা বুঝতে সহজ সঙ্গে ভুল কি? আমি মনে করি যে সময়টি বিকাশকারীরা এমন বিভ্রান্তিমূলক প্রযুক্তিগুলিকে প্রত্যাখ্যান করার জন্য তাদের কণ্ঠস্বর উত্থাপন করেছে যা ব্যবসায় বা উন্নয়নমূলক কাজের কোনও বা কোনও মূল্যই দেয় না।
NoChance

বস্তুর উপর: a1.x !== a2.x; প্রোটোটাইপে:a1.x === a2.x
হুয়ান মেন্ডেস

উত্তর:


467

উদাহরণগুলির খুব আলাদা ফলাফল রয়েছে।

পার্থক্যগুলি দেখার আগে, নিম্নলিখিতটি লক্ষ করা উচিত:

  • কোনও কনস্ট্রাক্টরের প্রোটোটাইপ উদাহরণের ব্যক্তিগত [[Prototype]]সম্পত্তির মাধ্যমে উদাহরণগুলির মধ্যে পদ্ধতি এবং মানগুলি ভাগ করে নেওয়ার একটি উপায় সরবরাহ করে ।
  • একটি ফাংশন এর এই কিভাবে ফাংশন বলা হয় বা ব্যবহার দ্বারা সেট করা হয় বেঁধে (এখানে আলোচনা নয়)। একটি ফাংশন একটি বস্তু (যেমন আহ্বান কোথায় myObj.method()) তাহলে এই পদ্ধতি রেফারেন্স মধ্যে অবজেক্ট। কোথায় এই কল দ্বারা বা ব্যবহার দ্বারা সেট করা না বেঁধে , এটা (একটি ব্রাউজারে উইন্ডো) বিশ্বব্যাপী বস্তু অক্ষমতা অথবা কঠোর মোডে, অনির্দিষ্ট থাকে।
  • জাভাস্ক্রিপ্ট একটি অবজেক্ট-ওরিয়েন্টেড ল্যাঙ্গুয়েজ, অর্থাৎ বেশিরভাগ মান ফাংশন সহ অবজেক্ট। (স্ট্রিংস, সংখ্যা এবং বুলিয়ানগুলি কোনও বস্তু নয় ))

সুতরাং এখানে প্রশ্নে স্নিপেটগুলি রয়েছে:

var A = function () {
    this.x = function () {
        //do something
    };
};

এই ক্ষেত্রে, ভেরিয়েবলকে Aএকটি মূল্য নির্ধারিত হয় যা কোনও ফাংশনের রেফারেন্স। যে ফাংশন ব্যবহার করে বলা হয় যখন A(), ফাংশন এর এই কল দ্বারা সেট করা না তাই এটি বিশ্বব্যাপী বস্তু অক্ষমতা এবং অভিব্যক্তি this.xকার্যকর window.x। ফলাফলটি ডান হাতের ক্রিয়াকলাপের এক্সপ্রেশনকে একটি রেফারেন্স বরাদ্দ করা হয় window.x

এর ব্যাপারে:

var A = function () { };
A.prototype.x = function () {
    //do something
};

খুব আলাদা কিছু ঘটে। প্রথম লাইনে ভেরিয়েবলকে Aএকটি ফাংশনের জন্য একটি রেফারেন্স বরাদ্দ করা হয়। জাভাস্ক্রিপ্টে, সমস্ত ফাংশন অবজেক্টের ডিফল্টরূপে একটি প্রোটোটাইপ সম্পত্তি থাকে তাই কোনও এ.প্রোটোটাইপ অবজেক্ট তৈরি করার জন্য আলাদা কোড নেই ।

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

আরেকটি উদাহরণ নীচে। এটি প্রথমটির মতো (এবং সম্ভবত আপনি যা জিজ্ঞাসা করতে চেয়েছিলেন):

var A = new function () {
    this.x = function () {
        //do something
    };
};

এই উদাহরণে, newঅপারেটরটি ফাংশন এক্সপ্রেশনের আগে যুক্ত করা হয়েছে যাতে ফাংশনটিকে কনস্ট্রাক্টর হিসাবে ডাকা হয়। যখন সাথে কল new, ফাংশন এর এই একটি নতুন অবজেক্ট যার ব্যক্তিগত রেফারেন্স হিসাবে সেট করা [[Prototype]]সম্পত্তি কন্সট্রাকটর পাবলিক রেফারেন্স হিসাবে সেট করা প্রোটোটাইপ । সুতরাং অ্যাসাইনমেন্ট স্টেটমেন্টে, xসম্পত্তিটি এই নতুন অবজেক্টে তৈরি করা হবে। যখন একটি কন্সট্রাকটর হিসাবে বলা, একটি ফাংশন তার ফেরৎ এই ডিফল্টরূপে বস্তু, তাই একটি পৃথক জন্য কোন প্রয়োজন নেই return this;বিবৃতি।

চেক করার জন্য যে একটি একটি আছে এক্স সম্পত্তি:

console.log(A.x) // function () {
                 //   //do something
                 // };

এটি কনস্ট্রাক্টরকে রেফারেন্স করার একমাত্র উপায় এ । কনস্ট্রাক্টরের মাধ্যমে হ'ল এটি নতুন হিসাবে অস্বাভাবিক ব্যবহার । এটি করা আরও সাধারণ বিষয় হবে:

var A = function () {
    this.x = function () {
        //do something
    };
};
var a = new A();

অনুরূপ ফলাফল অর্জনের আর একটি উপায় হ'ল তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন:

var A = (function () {
    this.x = function () {
        //do something
    };
}());

এই ক্ষেত্রে, Aডানদিকে ফাংশন কল করার রিটার্ন মান নির্ধারিত। এখানে পুনরায়, যেহেতু এই কলে সেট না করা হয়, এটা বিশ্বব্যাপী অবজেক্ট রেফারেন্স হবে this.xকার্যকর window.x। যেহেতু ফাংশনটি কোনও কিছুই ফেরায় না, তাই এর Aমান হবে undefined

আপনি যদি JSON এ / থেকে আপনার জাভাস্ক্রিপ্ট অবজেক্টকে সিরিয়ালাইজ করে এবং ডি-সিরিয়াল করছেন তবে এই দুটি পদ্ধতির মধ্যে এই পার্থক্যগুলিও প্রকাশ পায়। কোনও অবজেক্টের প্রোটোটাইপে সংজ্ঞায়িত পদ্ধতিগুলি আপনি যখন বস্তুটি সিরিয়ালকরণ করেন তখন ক্রমিকায়িত হয় না, যা সুবিধাজনক হতে পারে উদাহরণস্বরূপ আপনি কোনও সামগ্রীর কেবলমাত্র ডাটা অংশগুলি ক্রমিক করতে চান তবে এর পদ্ধতিগুলি নয়:

var A = function () { 
    this.objectsOwnProperties = "are serialized";
};
A.prototype.prototypeProperties = "are NOT serialized";
var instance = new A();
console.log(instance.prototypeProperties); // "are NOT serialized"
console.log(JSON.stringify(instance)); 
// {"objectsOwnProperties":"are serialized"} 

সম্পর্কিত প্রশ্ন :

সিডিনোট: দুটি পদ্ধতির মধ্যে কোনও উল্লেখযোগ্য মেমোরি সঞ্চয় নাও হতে পারে, তবে পদ্ধতি এবং বৈশিষ্ট্যগুলি ভাগ করে নেওয়ার জন্য প্রোটোটাইপ ব্যবহার করা প্রতিটি উদাহরণের নিজস্ব অনুলিপির চেয়ে কম মেমরি ব্যবহার করবে likely

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


49
@ কেপারো: আপনি ভুল বলেছেন। প্রতিটি বস্তুর একটি [অভ্যন্তরীণ] প্রোটোটাইপ অবজেক্ট থাকে (যা হতে পারে null) তবে এটি prototypeসম্পত্তি থেকে খুব আলাদা - যা ফাংশনগুলিতে রয়েছে এবং যখন এটি তৈরি করা হয় তখন সমস্ত দৃষ্টান্তের প্রোটোটাইপ সেট করা হয় new। বিশ্বাস করা যায় না এটি সত্যিকার অর্থে 87 টি upvotes পেয়েছে :-(
বার্গি

8
"The language is functional"আপনি কি নিশ্চিত যে এটি কার্যকরী মানে কি?
ফ্যান্ট0 মি

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

11
এই নিবন্ধটি বেশ বিভ্রান্ত হয় এবং বিভ্রান্ত কিভাবে এই সেট করা হয়। পুনরায় লেখার উপর কাজ করা।
রবজি

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

235

অন্যরা যেমন প্রথম সংস্করণ বলেছে, "এটি" ব্যবহার করে ফলাফল ক্লাস এ প্রতিটি ক্ষেত্রে ফাংশন পদ্ধতির নিজস্ব স্বতন্ত্র অনুলিপি "এক্স" রাখে। অন্যদিকে "প্রোটোটাইপ" ব্যবহারের অর্থ ক্লাস এ এর ​​প্রতিটি উদাহরণ পদ্ধতি "x" এর একই অনুলিপি ব্যবহার করবে।

এই সূক্ষ্ম পার্থক্যটি দেখানোর জন্য এখানে কিছু কোড দেওয়া হয়েছে:

// x is a method assigned to the object using "this"
var A = function () {
    this.x = function () { alert('A'); };
};
A.prototype.updateX = function( value ) {
    this.x = function() { alert( value ); }
};

var a1 = new A();
var a2 = new A();
a1.x();  // Displays 'A'
a2.x();  // Also displays 'A'
a1.updateX('Z');
a1.x();  // Displays 'Z'
a2.x();  // Still displays 'A'

// Here x is a method assigned to the object using "prototype"
var B = function () { };
B.prototype.x = function () { alert('B'); };

B.prototype.updateX = function( value ) {
    B.prototype.x = function() { alert( value ); }
}

var b1 = new B();
var b2 = new B();
b1.x();  // Displays 'B'
b2.x();  // Also displays 'B'
b1.updateX('Y');
b1.x();  // Displays 'Y'
b2.x();  // Also displays 'Y' because by using prototype we have changed it for all instances

অন্যরা যেমন উল্লেখ করেছে, একটি পদ্ধতি বা অন্যটি বেছে নেওয়ার বিভিন্ন কারণ রয়েছে। আমার নমুনাটি কেবলমাত্র পার্থক্যটি পরিষ্কারভাবে বোঝানোর জন্য।


5
এটিই আমি ঘটতে প্রত্যাশা করব, তবে আমি যখন উপরের মত অক্ষ পরিবর্তনের পরে কোনও নতুন অবজেক্টটি ইনস্ট্যান্ট করেছি, তবুও আমি 'এ' প্রদর্শন করি যদি না আমি সিঙ্গলটনের মতো এ ব্যবহার করি। jsbin.com/omida4/2/edit
jellyfishtree

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

4
এটি একটি স্থির পদ্ধতি! : ডি

6
হ্যাঁ ... 'প্রোটোটাইপ' অর্থ স্থিতিশীল বা শ্রেণি স্তর .. যা তৈরি করা সমস্ত দৃষ্টান্ত দ্বারা ভাগ করা হবে ... এবং 'এটি' এমন একটি উদাহরণ পদ্ধতি যা প্রতিটি উদাহরণের নিজস্ব অনুলিপি থাকবে
আনির দেব

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

152

এই 2 উদাহরণ নিন:

var A = function() { this.hey = function() { alert('from A') } };

বনাম

var A = function() {}
A.prototype.hey = function() { alert('from prototype') };

এখানকার বেশিরভাগ লোক (বিশেষত শীর্ষ রেটিংযুক্ত উত্তর) WHW ব্যাখ্যা না করে তারা কীভাবে আলাদা তা বোঝানোর চেষ্টা করেছিল। আমি মনে করি এটি ভুল এবং আপনি যদি প্রথমে মৌলিক বিষয়গুলি বুঝতে পারেন তবে পার্থক্যটি সুস্পষ্ট হয়ে উঠবে। আসুন প্রথমে মৌলিক বিষয়গুলি ব্যাখ্যা করার চেষ্টা করি ...

ক) একটি ফাংশন জাভাস্ক্রিপ্ট একটি বস্তু। জাভাস্ক্রিপ্টের প্রতিটি বস্তু একটি অভ্যন্তরীণ সম্পত্তি পায় (অর্থাত্ আপনি ক্রোমের মতো ব্রাউজারগুলি ব্যতীত অন্যান্য বৈশিষ্ট্যগুলির মতো এটি অ্যাক্সেস করতে পারবেন না) হিসাবে প্রায়শই উল্লেখ করা হয় __proto__(এটি আসলে anyObject.__proto__কী উল্লেখ করে তা দেখতে আপনি ক্রোমে টাইপ করতে পারেন This এটি কেবল এটি , একটি সম্পত্তি, আর কিছুই নয় Java জাভাস্ক্রিপ্টে একটি সম্পত্তি = কোনও জিনিসের ভিতরে একটি পরিবর্তনশীল, এর চেয়ে বেশি কিছুই নয় vari ভেরিয়েবলগুলি কী করে? তারা জিনিসগুলিকে নির্দেশ করে।

সুতরাং এই __proto__সম্পত্তি কি নির্দেশ করে? ভাল, সাধারণত অন্য একটি জিনিস (আমরা পরে তা কেন ব্যাখ্যা করব)। __proto__সম্পত্তিটির জন্য জাভাস্ক্রিপ্টকে বাধ্য করার একমাত্র উপায় হ'ল অন্য অবজেক্টের দিকে নির্দেশ না করা var newObj = Object.create(null)। এমনকি আপনি যদি এটি করেন তবে __proto__সম্পত্তিটি এখনও অবজেক্টের সম্পত্তি হিসাবে বিদ্যমান, কেবল এটি অন্য কোনও বস্তুর দিকে নির্দেশ করে না, এটি নির্দেশ করে null

এখানে বেশিরভাগ লোক বিভ্রান্ত হয়:

আপনি যখন জাভাস্ক্রিপ্টে একটি নতুন ফাংশন তৈরি করেন (যা একটি অবজেক্টটিও রয়েছে, মনে রাখবেন?), এই মুহুর্তটি সংজ্ঞায়িত হওয়ার পরে, জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে সেই ফাংশনে একটি নতুন সম্পত্তি তৈরি করে prototype। এটি চেষ্টা করুন:

var A = [];
A.prototype // undefined
A = function() {}
A.prototype // {} // got created when function() {} was defined

A.prototype__proto__সম্পত্তি থেকে সম্পূর্ণ আলাদা । আমাদের উদাহরণে, 'এ' এর এখন 'প্রোটোটাইপ' নামক TWO বৈশিষ্ট্য রয়েছে এবং __proto__। এটি মানুষের জন্য একটি বড় বিভ্রান্তি। prototypeএবং __proto__বৈশিষ্ট্যগুলি কোনওভাবেই সম্পর্কিত নয়, এগুলি পৃথক পৃথক মানকে নির্দেশ করে পৃথক জিনিস।

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

আপনিও ভাবতে পারেন, জাভাস্ক্রিপ্ট prototypeফাংশনটি সংজ্ঞায়িত করার সময় কেন কোনও ফাংশনের জন্য ডাকা সম্পত্তি তৈরি করে? কারণ এটি আপনাকে বোকা বানানোর চেষ্টা করে, হ্যাঁ আপনাকে বোকা বানায় যে এটি শ্রেণিবদ্ধ ভাষার মতো কাজ করে।

আসুন আমাদের উদাহরণটি দিয়ে চলুন এবং এর থেকে একটি "অবজেক্ট" তৈরি করুন A:

var a1 = new A();

এই জিনিসটি যখন ঘটেছিল তখন পটভূমিতে কিছু ঘটেছিল। a1এটি একটি সাধারণ ভেরিয়েবল যা একটি নতুন, খালি অবজেক্ট বরাদ্দ করা হয়েছিল।

newকোনও ফাংশন আমন্ত্রণের আগে আপনি অপারেটরটি ব্যবহার করেছিলেন A()তা ব্যাকগ্রাউন্ডে ADDITIONAL কিছু করেছিল। newশব্দ একটি নতুন বস্তু যা এখন রেফারেন্স নির্মিত a1এবং যে বস্তুর খালি। অতিরিক্তভাবে যা ঘটছে তা এখানে:

আমরা বলেছিলাম যে প্রতিটি ফাংশন সংজ্ঞা অনুসারে একটি নতুন সম্পত্তি তৈরি করা আছে prototype(যা আপনি এটির সাথে __proto__সম্পত্তির তুলনায় এটি অ্যাক্সেস করতে পারবেন ) তৈরি করা হয়েছে? ঠিক আছে, সেই সম্পত্তি এখন ব্যবহৃত হচ্ছে।

সুতরাং আমরা এখন এমন এক পর্যায়ে এসেছি যেখানে আমাদের তাজা বেকড খালি a1অবজেক্ট রয়েছে। আমরা বলেছিলাম যে জাভাস্ক্রিপ্টের সমস্ত বস্তুর একটি অভ্যন্তরীণ __proto__সম্পত্তি রয়েছে যা কোনও কিছুর দিকে নির্দেশ করে ( a1এটিও রয়েছে), এটি নাল হোক বা অন্য কোনও বস্তু। কি newঅপারেটর আছে যে এটা যে সেট করে __proto__ফাংশনের দিকে নির্দেশ সম্পত্তি prototypeসম্পত্তি। আবার পড়ুন। এটি মূলত এটি:

a1.__proto__ = A.prototype;

আমরা বলেছি যে A.prototypeএটি খালি বস্তু ছাড়া আর কিছুই নয় (যতক্ষণ না আমরা এটি সংজ্ঞায়নের আগে অন্য কিছুতে পরিবর্তন করি a1)। সুতরাং এখন মূলত a1.__proto__একই জিনিস A.prototypeনির্দেশ করে, যা যে খালি অবজেক্ট। তারা উভয়ই একই বস্তুর দিকে ইঙ্গিত করে যা এই লাইনটি ঘটানোর সময় তৈরি হয়েছিল:

A = function() {} // JS: cool. let's also create A.prototype pointing to empty {}

এখন, var a1 = new A()বিবৃতি প্রক্রিয়া করার সময় আরও একটি জিনিস ঘটছে । মূলত A()মৃত্যুদন্ড কার্যকর করা হয় এবং এ যদি এর মতো কিছু হয়:

var A = function() { this.hey = function() { alert('from A') } };

ভিতরে function() { }থাকা সমস্ত স্টাফ কার্যকর করতে চলেছে। আপনি যখন this.hey..লাইনে পৌঁছবেন তখন এতে thisপরিবর্তন করা হয় a1এবং আপনি এটি পান:

a1.hey = function() { alert('from A') }

কেন thisপরিবর্তন হয় তা আমি কভার করব না a1তবে এটি আরও জানার জন্য দুর্দান্ত উত্তর

সুতরাং সংক্ষিপ্তসার হিসাবে, যখন আপনি var a1 = new A()ব্যাকগ্রাউন্ডে 3 টি জিনিস ঘটে থাকে:

  1. সম্পূর্ণ নতুন শূন্য বস্তু তৈরি করা এবং নির্ধারিত হয় a1a1 = {}
  2. a1.__proto__A.prototypeপয়েন্ট হিসাবে একই জিনিস বিন্দু হিসাবে সম্পত্তি নির্ধারিত হয় (অন্য খালি বস্তু {})

  3. পদক্ষেপ 1 এ নতুন, শূন্য বস্তু তৈরির সেট A()দিয়ে ফাংশনটি সম্পাদন করা হচ্ছে this(কেন উপরে thisপরিবর্তন হয় আমি উপরে উল্লিখিত উত্তরটি পড়ি কেন a1)

এখন, অন্য একটি বস্তু তৈরি করার চেষ্টা করা যাক:

var a2 = new A();

1,2,3 পদক্ষেপ পুনরাবৃত্তি করবে। আপনি কিছু লক্ষ্য করেন? মূল শব্দটি পুনরাবৃত্তি হয়। পদক্ষেপ 1: a2একটি নতুন ফাঁকা বস্তু হবে, পদক্ষেপ 2: এর __proto__সম্পত্তি একই জিনিসকে A.prototypeনির্দেশ করবে এবং সবচেয়ে গুরুত্বপূর্ণভাবে, পদক্ষেপ 3: ফাংশনটি A()আবার কার্যকর করা হয়, যার অর্থ একটি ফাংশনযুক্ত সম্পত্তি a2পাবেন heya1এবং a2দুটি পৃথক সম্পত্তি রয়েছে যার নাম hey2 টি পৃথক ফাংশন রয়েছে! আমাদের এখন একই দুটি একই ভিন্ন ভিন্ন বস্তুর সদৃশ ফাংশন রয়েছে, উফ ... আপনি যদি আমাদের 1000 টি অবজেক্ট তৈরি করে থাকেন তবে এর মেমরির প্রভাবগুলি কল্পনা করতে পারেন new A, সমস্ত ফাংশন ডিক্লেয়ারেশনের পরে 2 সংখ্যাটির মতো কিছু বেশি স্মৃতি গ্রহণ করে So আমরা কীভাবে এটি প্রতিরোধ করব?

মনে রাখবেন __proto__সম্পত্তি কেন প্রতিটি বস্তুর উপর বিদ্যমান? যাতে আপনি যদি yoManসম্পত্তিটি পুনরুদ্ধার করেন a1(যা বিদ্যমান নেই) তবে তার __proto__সম্পত্তির সাথে পরামর্শ করা হবে, এটি যদি কোনও বস্তু হয় (এবং এটি বেশিরভাগ ক্ষেত্রে হয় তবে) এটি এটি রয়েছে কিনা তা খতিয়ে দেখবে yoManএবং যদি তা না থাকে, এটি সেই বস্তুর __proto__ইত্যাদির সাথে পরামর্শ করবে it যদি এটি হয় তবে এটি সেই সম্পত্তিটির মূল্য নেবে এবং এটি আপনার কাছে প্রদর্শন করবে।

সুতরাং কেউ এই সত্যটি ব্যবহার করার সিদ্ধান্ত নিয়েছে + আপনি যখন এটি তৈরি করেন তখন a1এর __proto__সম্পত্তি একই (খালি) অবজেক্টের দিকে A.prototypeইঙ্গিত করে এবং এটি করে:

var A = function() {}
A.prototype.hey = function() { alert('from prototype') };

শান্ত! এখন, আপনি যখন তৈরি করবেন a1, এটি আবার উপরের 3 টি ধাপের মধ্য দিয়ে যায় এবং 3 য় ধাপে, এটি কিছুই করে না, যেহেতু function A()কার্যকর করার কিছুই নেই। এবং যদি আমরা করি:

a1.hey

এটি দেখতে পাবে যে এটি a1ধারণ করে না heyএবং এটি তার __proto__সম্পত্তি বিষয়টিকে এটি রয়েছে কিনা তা যাচাই করবে which

এই পদ্ধতির সাহায্যে আমরা পদক্ষেপ 3 থেকে অংশটি সরিয়ে ফেলি যেখানে প্রতিটি নতুন অবজেক্ট তৈরিতে ফাংশনগুলি নকল করা হয়। পৃথক সম্পত্তি রাখার পরিবর্তে a1এবং a2রাখার পরিবর্তে heyএখন তাদের কারও কাছেই এটি নেই। কোনটি, আমার ধারণা, আপনি এখনই নিজেকে আবিষ্কার করেছেন। এটি দুর্দান্ত জিনিস ... যদি আপনি বুঝতে পারেন __proto__এবং Function.prototypeএই জাতীয় প্রশ্নগুলি বেশ সুস্পষ্ট হবে।

দ্রষ্টব্য: কিছু লোক অভ্যন্তরীণ প্রোটোটাইপ সম্পত্তি হিসাবে কল না করার প্রবণতা রাখে __proto__, আমি এই নামটি পোস্টের মাধ্যমে ব্যবহার করে Functional.prototypeসম্পত্তিটিকে দুটি আলাদা জিনিস হিসাবে পরিষ্কারভাবে আলাদা করতে পারি ।


1
সত্যিই পুরো এবং তথ্যপূর্ণ উত্তর। আমি উপরের অবজেক্ট স্ট্রাকচারগুলি ব্যবহার করে কিছু মেমরি টেস্ট করেছি (এ। প্রোটোটাইপ.হাই বনাম অবজেক্ট এইটি) এবং প্রতিটিটির 1000 টি উদাহরণ তৈরি করেছি। প্রোটোটাইপের তুলনায় অবজেক্ট প্রোপার্টি অ্যাপ্রোমের জন্য মেমরির পদচিহ্নটি প্রায় 100 কেবি বড় ছিল। আমি তখন একই উদ্দেশ্যে "নির্বোধ" নামে আরও একটি ফাংশন যুক্ত করেছি এবং এটি লিনিয়ারালি 200 কেবিতে বাড়িয়েছে। তাৎপর্যপূর্ণ নয়, তবে চিনাবাদামও নয়।
jookyone

আরও মজার বিষয় হ'ল স্থানীয়ভাবে চলমান অবজেক্ট প্রোপার্টি পদ্ধতির তুলনায় প্রোটোটাইপ পদ্ধতিটি সামান্য ধীর ছিল। সামগ্রিকভাবে, আমি নিশ্চিত নই যে জাভাস্ক্রিপ্টটি 10k এর উপরে নম্বরযুক্ত অবজেক্টগুলির ডেটা ম্যানিপুলেশনের জন্য ব্যবহার করা উচিত, সুতরাং সম্ভাব্য মেমরির প্রভাবগুলির উপর ভিত্তি করে পদ্ধতির পরিবর্তন করার কোনও কারণকে অবজ্ঞা করে। এই মুহুর্তে কাজটি একটি সার্ভারে অফলোড করা উচিত।
jookyone

বিষয়টি হ'ল __proto__এবং .prototypeসম্পূর্ণ আলাদা জিনিস।
ওয়াইউ

1
আমি আপনাকে কেবল একটি উত্সাহ দিতে সন্তুষ্ট বোধ করি না ... ভাল!
ক্রিস্টিয়ানমিট

58

বেশিরভাগ ক্ষেত্রে এগুলি মূলত একই হয় তবে দ্বিতীয় সংস্করণ মেমরিটি সংরক্ষণ করে কারণ প্রতিটি বস্তুর জন্য পৃথক ফাংশনের পরিবর্তে ফাংশনের কেবলমাত্র একটি উদাহরণ রয়েছে।

প্রথম ফর্মটি ব্যবহার করার একটি কারণ হ'ল "ব্যক্তিগত সদস্যদের" অ্যাক্সেস করা। উদাহরণ স্বরূপ:

var A = function () {
    var private_var = ...;

    this.x = function () {
        return private_var;
    };

    this.setX = function (new_x) {
        private_var = new_x;
    };
};

জাভাস্ক্রিপ্টের স্কোপিং বিধিগুলির কারণে, প্রাইভেট_ভার এই.এসকে নির্ধারিত ফাংশনে উপলব্ধ, তবে বস্তুর বাইরে নয়।


1
প্রোটোটাইপের মাধ্যমে কীভাবে ব্যক্তিগত সদস্যদের অ্যাক্সেস করবেন তার উদাহরণের জন্য এই পোস্টটি দেখুন: stackoverflow.com/a/1441692/654708
জিএফলে 83

@ GFoley83 যে উত্তরটি দেখায় না - প্রোটোটাইপ পদ্ধতিগুলি প্রদত্ত অবজেক্টের "সর্বজনীন" বৈশিষ্ট্যগুলিতে কেবল অ্যাক্সেস করতে পারে। কেবল সুবিধাভোগী পদ্ধতিগুলি (প্রোটোটাইপে নয়) ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারে।
Alnitak

27

প্রথম উদাহরণটি কেবলমাত্র সেই অবজেক্টের জন্য ইন্টারফেস পরিবর্তন করে। দ্বিতীয় উদাহরণটি class শ্রেণীর সমস্ত বস্তুর ইন্টারফেস পরিবর্তন করে।


উভয়ই সেই xসমস্ত অবজেক্টের জন্য ফাংশনটি উপলব্ধ করবে যার প্রোটোটাইপ এ এর ​​একটি নতুন উদাহরণ অর্পণ করা হয়েছে:function B () {}; B.prototype = new A(); var b = new B(); b.x() // Will call A.x if A is defined by first example;
স্পেন্সার উইলিয়ামস

21

thisপরিবর্তে ব্যবহারের ক্ষেত্রে চূড়ান্ত সমস্যাটি prototypeহ'ল কোনও পদ্ধতিকে ওভাররাইড করার সময়, বেস শ্রেণীর নির্মাতা এখনও ওভাররাইড পদ্ধতিতে উল্লেখ করবেন। এই বিবেচনা:

BaseClass = function() {
    var text = null;

    this.setText = function(value) {
        text = value + " BaseClass!";
    };

    this.getText = function() {
        return text;
    };

    this.setText("Hello"); // This always calls BaseClass.setText()
};

SubClass = function() {
    // setText is not overridden yet,
    // so the constructor calls the superclass' method
    BaseClass.call(this);

    // Keeping a reference to the superclass' method
    var super_setText = this.setText;
    // Overriding
    this.setText = function(value) {
        super_setText.call(this, "SubClass says: " + value);
    };
};
SubClass.prototype = new BaseClass();

var subClass = new SubClass();
console.log(subClass.getText()); // Hello BaseClass!

subClass.setText("Hello"); // setText is already overridden
console.log(subClass.getText()); // SubClass says: Hello BaseClass!

বনাম:

BaseClass = function() {
    this.setText("Hello"); // This calls the overridden method
};

BaseClass.prototype.setText = function(value) {
    this.text = value + " BaseClass!";
};

BaseClass.prototype.getText = function() {
    return this.text;
};

SubClass = function() {
    // setText is already overridden, so this works as expected
    BaseClass.call(this);
};
SubClass.prototype = new BaseClass();

SubClass.prototype.setText = function(value) {
    BaseClass.prototype.setText.call(this, "SubClass says: " + value);
};

var subClass = new SubClass();
console.log(subClass.getText()); // SubClass says: Hello BaseClass!

যদি আপনি ভাবেন যে এটি কোনও সমস্যা নয়, তবে এটি আপনি ব্যক্তিগত ভেরিয়েবলগুলি ছাড়া বাঁচতে পারবেন কিনা এবং আপনি যখন দেখবেন তখন কোনও ফুটো জানার জন্য যথেষ্ট অভিজ্ঞ কিনা তা নির্ভর করে। এছাড়াও, পদ্ধতির সংজ্ঞাটি অসুবিধাগুলির পরে কনস্ট্রাক্টর লজিক স্থাপন করা।

var A = function (param1) {
    var privateVar = null; // Private variable

    // Calling this.setPrivateVar(param1) here would be an error

    this.setPrivateVar = function (value) {
        privateVar = value;
        console.log("setPrivateVar value set to: " + value);

        // param1 is still here, possible memory leak
        console.log("setPrivateVar has param1: " + param1);
    };

    // The constructor logic starts here possibly after
    // many lines of code that define methods

    this.setPrivateVar(param1); // This is valid
};

var a = new A(0);
// setPrivateVar value set to: 0
// setPrivateVar has param1: 0

a.setPrivateVar(1);
//setPrivateVar value set to: 1
//setPrivateVar has param1: 0

বনাম:

var A = function (param1) {
    this.setPublicVar(param1); // This is valid
};
A.prototype.setPublicVar = function (value) {
    this.publicVar = value; // No private variable
};

var a = new A(0);
a.setPublicVar(1);
console.log(a.publicVar); // 1

20

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

prototypeএকটি ফাংশন কন্সট্রাকটর সম্পত্তির যখন ব্যবহার যে ফাংশন সঙ্গে তৈরি করা সমস্ত উদাহরণ এর প্রোটোটাইপ অবজেক্ট বোঝায় new


আপনার প্রথম উদাহরণে, আপনি ফাংশন xদিয়ে তৈরি প্রতিটি দৃষ্টিতে একটি সম্পত্তি যুক্ত করছেন A

var A = function () {
    this.x = function () {
        //do something
    };
};

var a = new A();    // constructor function gets executed
                    // newly created object gets an 'x' property
                    // which is a function
a.x();              // and can be called like this

দ্বিতীয় উদাহরণে আপনি প্রোটোটাইপ অবজেক্টে একটি সম্পত্তি যুক্ত করছেন যা সমস্ত দৃষ্টিকোণ দ্বারা তৈরি করা Aহয়েছে।

var A = function () { };
A.prototype.x = function () {
    //do something
};

var a = new A();    // constructor function gets executed
                    // which does nothing in this example

a.x();              // you are trying to access the 'x' property of an instance of 'A'
                    // which does not exist
                    // so JavaScript looks for that property in the prototype object
                    // that was defined using the 'prototype' property of the constructor

উপসংহারে, প্রথম উদাহরণে প্রতিটি উদাহরণের জন্য ফাংশনের একটি অনুলিপি বরাদ্দ করা হয় । দ্বিতীয় উদাহরণে ফাংশনের একক অনুলিপি সমস্ত দৃষ্টান্ত দ্বারা ভাগ করা হয়


1
প্রশ্নের সর্বাধিক সোজা-থেকে-দফার উত্তর হওয়ার জন্য এটি দিয়েছিলেন।
নিক

1
আমি আপনার সরাসরি এগিয়ে যোগাযোগ পছন্দ করেছেন !! দুম্ শব্দে আঘাত!
যুবরাজ বিজয় প্রতাপ

16

পার্থক্য কি? => অনেক।

আমি মনে করি, thisসংস্করণটি এনক্যাপসুলেশন সক্ষম করতে ব্যবহৃত হয়, অর্থাৎ ডেটা লুকানো iding এটি ব্যক্তিগত ভেরিয়েবলগুলি ম্যানিপুলেট করতে সহায়তা করে।

আসুন নীচের উদাহরণটি দেখুন:

var AdultPerson = function() {

  var age;

  this.setAge = function(val) {
    // some housekeeping
    age = val >= 18 && val;
  };

  this.getAge = function() {
    return age;
  };

  this.isValid = function() {
    return !!age;
  };
};

এখন, prototypeকাঠামোটি নিম্নলিখিত হিসাবে প্রয়োগ করা যেতে পারে:

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

AdultPerson.prototype.getRights = function() {
  // Should be valid
  return this.isValid() && ['Booze', 'Drive'];
};

এখন বাস্তবায়ন তাকান।

var p1 = new AdultPerson;
p1.setAge(12); // ( age = false )
console.log(p1.getRights()); // false ( Kid alert! )
p1.setAge(19); // ( age = 19 )
console.log(p1.getRights()); // ['Booze', 'Drive'] ( Welcome AdultPerson )

var p2 = new AdultPerson;
p2.setAge(45);    
console.log(p2.getRights()); // The same getRights() method, *** not a new copy of it ***

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


3
+1 অন্যান্য সংখ্যার থেকে অনেক কম সংশ্লেষিত এবং গ্রাফিকাল উত্তর। তবে এই (ভাল) উদাহরণ দেওয়ার আগে আপনার আরও কিছুটা বিশদভাবে জানানো উচিত।
yerforkferchips

1
আমি "এই সংস্করণটি এনক্যাপসুলেশন, অর্থাৎ ডেটা লুকানো সক্ষম করতে ব্যবহৃত হয়" সম্পর্কে নিশ্চিত নই। যদি কোনও ফাংশনের অভ্যন্তরীণ বৈশিষ্ট্যটিকে "this.myProperty = ..." হিসাবে "এটি" ব্যবহার করে সংজ্ঞায়িত করা হয়, তবে এ জাতীয় সম্পত্তি "ব্যক্তিগত" নয় এবং "নতুন" ব্যবহার করে শ্রেণীর বাইরের অবজেক্ট থেকে অ্যাক্সেস করা যেতে পারে।
NoChance

14

প্রোটোটাইপ শ্রেণীর টেম্পলেট; যা এর ভবিষ্যতের সমস্ত দৃষ্টান্তের জন্য প্রযোজ্য। যদিও এটি বস্তুর নির্দিষ্ট উদাহরণ।


14

আমি জানি এটির মৃত্যুর জবাব দেওয়া হয়েছে তবে আমি গতির পার্থক্যের প্রকৃত উদাহরণ দেখাতে চাই।

সরাসরি অবজেক্টে ফাংশন

প্রোটোটাইপ ফাংশন

এখানে আমরা printক্রোমে একটি পদ্ধতি সহ 2,000,000 নতুন অবজেক্ট তৈরি করছি । আমরা প্রতিটি বস্তুকে একটি অ্যারেতে সংরক্ষণ করছি। ফেলে printপ্রোটোটাইপ উপর যতদিন 1/2 সম্পর্কে লাগে।


13

জাভাস্ক্রিপ্ট প্রশিক্ষণ কোর্স চলাকালীন আমি আপনাকে আরও একটি বিস্তৃত উত্তর দিতে পারি।

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

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

আপনি আপনার প্রশ্নে দুটি নিদর্শন দেখিয়েছেন। আমি আরও দুটি ব্যাখ্যা করার চেষ্টা করব এবং প্রাসঙ্গিক হলে পার্থক্যগুলি ব্যাখ্যা করার চেষ্টা করব। সম্পাদনা / প্রসারিত নির্দ্বিধায়। সমস্ত উদাহরণে এটি একটি গাড়ী অবজেক্ট সম্পর্কে যা একটি অবস্থান আছে এবং স্থানান্তর করতে পারে।

অবজেক্ট ডেকরেটর প্যাটার্ন

আজকাল এই প্যাটার্নটি এখনও প্রাসঙ্গিক কিনা তা নিশ্চিত নয় তবে এটি বিদ্যমান। এবং এটি সম্পর্কে জানা ভাল। আপনি কেবল একটি জিনিস এবং একটি সম্পত্তি সজ্জা ফাংশনটিতে পাস করুন। সাজসজ্জার সম্পত্তি এবং পদ্ধতি দিয়ে বস্তুটি ফেরত দেয়।

var carlike = function(obj, loc) {
    obj.loc = loc;
    obj.move = function() {
        obj.loc++;
    };
    return obj;
};

var amy = carlike({}, 1);
amy.move();
var ben = carlike({}, 9);
ben.move();

কার্যকরী ক্লাস

জাভাস্ক্রিপ্ট একটি ফাংশন একটি বিশেষায়িত বস্তু হয়। আহ্বান করা ছাড়াও, একটি ফাংশন অন্যান্য অবজেক্টের মতো বৈশিষ্ট্যও সঞ্চয় করতে পারে।

এক্ষেত্রে Carএকটি ফাংশন ( এটিও মনে করুন অবজেক্ট ) যা আপনি যেমন ব্যবহার করতে চান তেমনভাবেই আহ্বান করা যেতে পারে। এটির একটি সম্পত্তি রয়েছে methods(যা কোনও moveফাংশন সহ একটি বস্তু )। যখন অনুরোধ Carকরা হয় তখন extendফাংশনটি বলা হয়, যা কিছু যাদু করে এবং এর Carমধ্যে সংজ্ঞায়িত পদ্ধতিগুলির সাথে ফাংশন (থিংক অবজেক্ট) প্রসারিত করে methods

এই উদাহরণটি পৃথক হলেও প্রশ্নের প্রথম উদাহরণের নিকটে আসে।

var Car = function(loc) {
    var obj = {loc: loc};
    extend(obj, Car.methods);
    return obj;
};

Car.methods = {
    move : function() {
        this.loc++;
    }
};

var amy = Car(1);
amy.move();
var ben = Car(9);
ben.move();

প্রোটোটাইপাল ক্লাস

প্রথম দুটি নিদর্শনগুলি ভাগ করে নেওয়া পদ্ধতিগুলি নির্ধারণ করার জন্য কৌশলগুলি ব্যবহার করে বা কনস্ট্রাক্টরের শরীরে ইনলাইন সংজ্ঞায়িত পদ্ধতি ব্যবহারের আলোচনার অনুমতি দেয়। উভয় ক্ষেত্রেই প্রতিটি ঘটনার নিজস্ব moveফাংশন রয়েছে।

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

তবে এটি জানতে আকর্ষণীয় prototypeএকটি বিষয় রয়েছে : প্রতিটি বস্তুর একটি সুবিধার সম্পত্তি রয়েছে constructorযা এটি ফাংশনে ফিরে আসে (থিংজ অবজেক্ট) এটি সংযুক্ত হয়ে আসে।

শেষ তিনটি লাইন সম্পর্কিত:

এই উদাহরণে Carলিঙ্ক prototypeবস্তু, যার মাধ্যমে লিঙ্ক constructorথেকে Carনিজেই, অর্থাত্ Car.prototype.constructorহয় Carনিজেই। এটি আপনাকে নির্ধারণ করতে সক্ষম করে যে কোন কনস্ট্রাক্টর ফাংশন একটি নির্দিষ্ট অবজেক্ট তৈরি করেছে।

amy.constructorএর চেহারা ব্যর্থ হয়েছে এবং এইভাবে এটি অর্পণ করা হয় Car.prototype, যার নির্মাণকারীর সম্পত্তি রয়েছে। এবং তাই amy.constructorহয় Car

তদ্ব্যতীত, amyএকটি instanceof Carinstanceofঅপারেটর যদি ডান প্রতীক এর প্রোটোটাইপ বস্তু (এইজন্য করে কাজ করে Car) আর ডানদিকের প্রতীক এর প্রোটোটাইপ (যে কোন জায়গায় পাওয়া যাবে amy) শৃঙ্খল।

var Car = function(loc) {
    var obj = Object.create(Car.prototype);
    obj.loc = loc;
    return obj;
};

Car.prototype.move = function() {
        this.loc++;
};

var amy = Car(1);
amy.move();
var ben = Car(9);
ben.move();

console.log(Car.prototype.constructor);
console.log(amy.constructor);
console.log(amy instanceof Car);

কিছু বিকাশকারী শুরুতে বিভ্রান্ত হতে পারে। নীচে উদাহরণ দেখুন:

var Dog = function() {
  return {legs: 4, bark: alert};
};

var fido = Dog();
console.log(fido instanceof Dog);

instanceofঅপারেটর আয় false, কারণ Dogএর প্রোটোটাইপ যে কোন জায়গায় পাওয়া যাবে না fidoগণ প্রোটোটাইপ শৃঙ্খল। fidoহ'ল একটি সরল অবজেক্ট যা একটি অবজেক্টকে আক্ষরিক অর্থে তৈরি করা হয়, অর্থাৎ এটি কেবল প্রতিনিধিত্ব করে Object.prototype

সিউডোক্লাসিক্যাল নিদর্শন

এটি সত্যিকারের সরলীকৃত আকারে প্রোটোটাইপাল প্যাটার্নের অন্য একটি রূপ এবং উদাহরণস্বরূপ জাভাতে যারা প্রোগ্রাম করেন তাদের করতে আরও পরিচিত, কারণ এটি newনির্মাণকারী ব্যবহার করে ।

এটি প্রোটোটাইপাল প্যাটার্নের মতোই কাজ করে, এটি কেবল প্রোটোটাইপাল প্যাটার্নের সিনট্যাকটিক চিনির ওভারটপ।

তবে প্রাথমিক পার্থক্যটি হ'ল জাভাস্ক্রিপ্ট ইঞ্জিনগুলিতে প্রয়োগ করা অপ্টিমাইজেশন রয়েছে যা কেবলমাত্র সিউডোক্লাসিকাল প্যাটার্ন ব্যবহার করার সময় প্রয়োগ হয়। সিউডোক্ল্যাসিকাল প্যাটার্নটি ভাবুন প্রোটোটাইপাল প্যাটার্নের সম্ভবত দ্রুততম সংস্করণ; উভয় উদাহরণে বস্তুর সম্পর্ক একই are

var Car = function(loc) {
    this.loc = loc;
};

Car.prototype.move = function() {
        this.loc++;
};

var amy = new Car(1);
amy.move();
var ben = new Car(9);
ben.move();

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

একটি বিভাগ যা প্রোটোটাইপ (চেইন) এ সাধারণ বৈশিষ্ট্য / পদ্ধতিগুলি সংজ্ঞায়িত করে।

এবং আরেকটি বিভাগ যেখানে আপনি সংজ্ঞা স্থাপন করেছেন যা বস্তুগুলি একে অপরের থেকে পৃথক করে ( locউদাহরণগুলিতে পরিবর্তনশীল)।

এটি আমাদের জাভাস্ক্রিপ্টে সুপারক্লাস বা সাবক্লাসের মতো ধারণাগুলি প্রয়োগ করার অনুমতি দেয়।

যোগ বা সম্পাদনা করতে নির্দ্বিধায়। আরও একবার সম্পূর্ণ হয়ে গেলে আমি এটি একটি সম্প্রদায় উইকি বোধহয় করতে পারি।


খুব পুঙ্খানুপুঙ্খ পোস্টটি কড়া নাড়ানোর জন্য নয়, তবে আমি ভেবেছিলাম ওও এবং প্রোটোটাইপিকাল উত্তরাধিকার হ'ল মূলত বিভিন্ন চিন্তাভাবনার স্কুল।
নিক

এগুলি হয় তবে বিভিন্ন কৌশল / চিন্তাভাবনা নিয়ে একজন "ওও" করতে পারে, তাই না?
এলি

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

আমি বলতে চাইছি, আপনি যদি ওও স্টাইলটি অনুশীলন করতে চান এবং ভাষা এমন কৌশলগুলির একটি সেট সরবরাহ করে যা এটি করতে সহায়তা করে, এটি অগত্যা ভুল নয়।
এলে

11

আমি বিশ্বাস করি যে @ ম্যাথু ক্রামলে ঠিক বলেছেন। এইগুলি হল বৈশিষ্ট্যগুলি , গঠনের দিক যদি না হয়, সমতুল্য। আপনি যদি ফায়ারব্যাগ ব্যবহার করে তৈরি করা বস্তুগুলি newদেখতে ব্যবহার করেন তবে দেখতে পাবেন যে সেগুলি একই। তবে, আমার পছন্দটি নিম্নলিখিত হবে। আমি অনুমান করছি যে এটি সি # / জাভাতে আমি যেভাবে অভ্যস্ত ছিল ঠিক তার মতোই মনে হয়। অর্থাৎ শ্রেণীর সংজ্ঞা দিন, ক্ষেত্র, নির্মাতা এবং পদ্ধতি নির্ধারণ করুন।

var A = function() {};
A.prototype = {
    _instance_var: 0,

    initialize: function(v) { this._instance_var = v; },

    x: function() {  alert(this._instance_var); }
};

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


2
উদাহরণস্বরূপ _ইনস্ট্যান্স_ভার initializeএবং x methods do not refer to the _আইন্সটেন্স_ভার সম্পত্তি হিসাবে A, তবে একটি বিশ্বব্যাপী। ব্যবহার করুন this._instance_varযদি আপনি ব্যবহার করতে অভিপ্রেত _instance_varএকটি সম্পত্তির Aউদাহরণস্বরূপ।
লেকেনস্টেইন

2
মজার বিষয় হ'ল, বেনরিও এরকম একটি ত্রুটি করেছিলেন, যা দু'বছরের পরেও উন্মোচিত হয়েছে: পি
লেকেনস্টেইন

10

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

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

http://jsperf.com/functions-in-constructor-vs-prototype


8

স্ট্যাটিকালি টাইপ করা ভাষা নিয়ে ভাবুন, জিনিসগুলি prototypeস্থির থাকে এবং বিষয়গুলিতে thisউদাহরণ সম্পর্কিত হয়।

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