এর মধ্যে পার্থক্য কী
var A = function () {
this.x = function () {
//do something
};
};
এবং
var A = function () { };
A.prototype.x = function () {
//do something
};
a1.x !== a2.x
; প্রোটোটাইপে:a1.x === a2.x
এর মধ্যে পার্থক্য কী
var A = function () {
this.x = function () {
//do something
};
};
এবং
var A = function () { };
A.prototype.x = function () {
//do something
};
a1.x !== a2.x
; প্রোটোটাইপে:a1.x === a2.x
উত্তর:
উদাহরণগুলির খুব আলাদা ফলাফল রয়েছে।
পার্থক্যগুলি দেখার আগে, নিম্নলিখিতটি লক্ষ করা উচিত:
[[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
জাভাস্ক্রিপ্ট কোনও নিম্ন-স্তরের ভাষা নয়। প্রোটোটাইপিং বা অন্যান্য উত্তরাধিকারের ধরণগুলি মেমরির বরাদ্দ করার পদ্ধতিটি স্পষ্টভাবে পরিবর্তনের উপায় হিসাবে ভাবা খুব মূল্যবান নাও হতে পারে।
null
) তবে এটি prototype
সম্পত্তি থেকে খুব আলাদা - যা ফাংশনগুলিতে রয়েছে এবং যখন এটি তৈরি করা হয় তখন সমস্ত দৃষ্টান্তের প্রোটোটাইপ সেট করা হয় new
। বিশ্বাস করা যায় না এটি সত্যিকার অর্থে 87 টি upvotes পেয়েছে :-(
"The language is functional"
আপনি কি নিশ্চিত যে এটি কার্যকরী মানে কি?
A
একটি ফাংশন হিসাবে ব্যবহার করেন তবে কী হবে তা সম্পর্কে এবং অন্য অর্ধেকটি অস্পষ্ট এবং অপ্রচলিত উপায়গুলি সম্পর্কে সোজা কিছু।
অন্যরা যেমন প্রথম সংস্করণ বলেছে, "এটি" ব্যবহার করে ফলাফল ক্লাস এ প্রতিটি ক্ষেত্রে ফাংশন পদ্ধতির নিজস্ব স্বতন্ত্র অনুলিপি "এক্স" রাখে। অন্যদিকে "প্রোটোটাইপ" ব্যবহারের অর্থ ক্লাস এ এর প্রতিটি উদাহরণ পদ্ধতি "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
অন্যরা যেমন উল্লেখ করেছে, একটি পদ্ধতি বা অন্যটি বেছে নেওয়ার বিভিন্ন কারণ রয়েছে। আমার নমুনাটি কেবলমাত্র পার্থক্যটি পরিষ্কারভাবে বোঝানোর জন্য।
this
, যা পদ্ধতির মালিক। অর্থাত্ পদ্ধতিটির কোনও মালিকানা নেই। এই ক্ষেত্রে একটি this
অবজেক্ট রয়েছে, যেমন উদাহরণ এ শ্রেণিতে দেখানো হয়েছে।
এই 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 টি জিনিস ঘটে থাকে:
a1
।a1 = {}
a1.__proto__
A.prototype
পয়েন্ট হিসাবে একই জিনিস বিন্দু হিসাবে সম্পত্তি নির্ধারিত হয় (অন্য খালি বস্তু {})
পদক্ষেপ 1 এ নতুন, শূন্য বস্তু তৈরির সেট A()
দিয়ে ফাংশনটি সম্পাদন করা হচ্ছে this
(কেন উপরে this
পরিবর্তন হয় আমি উপরে উল্লিখিত উত্তরটি পড়ি কেন a1
)
এখন, অন্য একটি বস্তু তৈরি করার চেষ্টা করা যাক:
var a2 = new A();
1,2,3 পদক্ষেপ পুনরাবৃত্তি করবে। আপনি কিছু লক্ষ্য করেন? মূল শব্দটি পুনরাবৃত্তি হয়। পদক্ষেপ 1: a2
একটি নতুন ফাঁকা বস্তু হবে, পদক্ষেপ 2: এর __proto__
সম্পত্তি একই জিনিসকে A.prototype
নির্দেশ করবে এবং সবচেয়ে গুরুত্বপূর্ণভাবে, পদক্ষেপ 3: ফাংশনটি A()
আবার কার্যকর করা হয়, যার অর্থ একটি ফাংশনযুক্ত সম্পত্তি a2
পাবেন hey
। a1
এবং a2
দুটি পৃথক সম্পত্তি রয়েছে যার নাম hey
2 টি পৃথক ফাংশন রয়েছে! আমাদের এখন একই দুটি একই ভিন্ন ভিন্ন বস্তুর সদৃশ ফাংশন রয়েছে, উফ ... আপনি যদি আমাদের 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
সম্পত্তিটিকে দুটি আলাদা জিনিস হিসাবে পরিষ্কারভাবে আলাদা করতে পারি ।
__proto__
এবং .prototype
সম্পূর্ণ আলাদা জিনিস।
বেশিরভাগ ক্ষেত্রে এগুলি মূলত একই হয় তবে দ্বিতীয় সংস্করণ মেমরিটি সংরক্ষণ করে কারণ প্রতিটি বস্তুর জন্য পৃথক ফাংশনের পরিবর্তে ফাংশনের কেবলমাত্র একটি উদাহরণ রয়েছে।
প্রথম ফর্মটি ব্যবহার করার একটি কারণ হ'ল "ব্যক্তিগত সদস্যদের" অ্যাক্সেস করা। উদাহরণ স্বরূপ:
var A = function () {
var private_var = ...;
this.x = function () {
return private_var;
};
this.setX = function (new_x) {
private_var = new_x;
};
};
জাভাস্ক্রিপ্টের স্কোপিং বিধিগুলির কারণে, প্রাইভেট_ভার এই.এসকে নির্ধারিত ফাংশনে উপলব্ধ, তবে বস্তুর বাইরে নয়।
প্রথম উদাহরণটি কেবলমাত্র সেই অবজেক্টের জন্য ইন্টারফেস পরিবর্তন করে। দ্বিতীয় উদাহরণটি 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;
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
প্রতিটি বস্তু একটি প্রোটোটাইপ অবজেক্টের সাথে লিঙ্কযুক্ত। অস্তিত্বহীন কোনও সম্পত্তি অ্যাক্সেস করার চেষ্টা করার সময়, জাভাস্ক্রিপ্ট সেই সম্পত্তিটির জন্য অবজেক্টের প্রোটোটাইপ অবজেক্টটি সন্ধান করবে এবং উপস্থিত থাকলে তা ফিরিয়ে দেবে।
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
উপসংহারে, প্রথম উদাহরণে প্রতিটি উদাহরণের জন্য ফাংশনের একটি অনুলিপি বরাদ্দ করা হয় । দ্বিতীয় উদাহরণে ফাংশনের একক অনুলিপি সমস্ত দৃষ্টান্ত দ্বারা ভাগ করা হয় ।
পার্থক্য কি? => অনেক।
আমি মনে করি, 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 ***
আশাকরি এটা সাহায্য করবে.
প্রোটোটাইপ শ্রেণীর টেম্পলেট; যা এর ভবিষ্যতের সমস্ত দৃষ্টান্তের জন্য প্রযোজ্য। যদিও এটি বস্তুর নির্দিষ্ট উদাহরণ।
আমি জানি এটির মৃত্যুর জবাব দেওয়া হয়েছে তবে আমি গতির পার্থক্যের প্রকৃত উদাহরণ দেখাতে চাই।
এখানে আমরা print
ক্রোমে একটি পদ্ধতি সহ 2,000,000 নতুন অবজেক্ট তৈরি করছি । আমরা প্রতিটি বস্তুকে একটি অ্যারেতে সংরক্ষণ করছি। ফেলে print
প্রোটোটাইপ উপর যতদিন 1/2 সম্পর্কে লাগে।
জাভাস্ক্রিপ্ট প্রশিক্ষণ কোর্স চলাকালীন আমি আপনাকে আরও একটি বিস্তৃত উত্তর দিতে পারি।
বেশিরভাগ উত্তরে ইতিমধ্যে তফাতটির উল্লেখ করা হয়েছে, যেমন ফাংশনটি প্রোটোটাইপ করার সময় সমস্ত (ভবিষ্যতের) দৃষ্টান্তের সাথে ভাগ করা হয়। যেখানে ক্লাসে ফাংশনটি ঘোষণা করা প্রতিটি উদাহরণের জন্য একটি অনুলিপি তৈরি করবে।
সাধারণভাবে কোনও সঠিক বা ভুল নেই, এটি আপনার প্রয়োজনের উপর নির্ভর করে স্বাদ বা ডিজাইনের সিদ্ধান্তের বিষয়। প্রোটোটাইপ হ'ল কৌশলটি যা কোনও অবজেক্ট ওরিয়েন্টেড পদ্ধতিতে বিকাশের জন্য ব্যবহৃত হয়, যেমনটি আমি আশা করি যে আপনি এই উত্তরটির শেষে দেখবেন।
আপনি আপনার প্রশ্নে দুটি নিদর্শন দেখিয়েছেন। আমি আরও দুটি ব্যাখ্যা করার চেষ্টা করব এবং প্রাসঙ্গিক হলে পার্থক্যগুলি ব্যাখ্যা করার চেষ্টা করব। সম্পাদনা / প্রসারিত নির্দ্বিধায়। সমস্ত উদাহরণে এটি একটি গাড়ী অবজেক্ট সম্পর্কে যা একটি অবস্থান আছে এবং স্থানান্তর করতে পারে।
আজকাল এই প্যাটার্নটি এখনও প্রাসঙ্গিক কিনা তা নিশ্চিত নয় তবে এটি বিদ্যমান। এবং এটি সম্পর্কে জানা ভাল। আপনি কেবল একটি জিনিস এবং একটি সম্পত্তি সজ্জা ফাংশনটিতে পাস করুন। সাজসজ্জার সম্পত্তি এবং পদ্ধতি দিয়ে বস্তুটি ফেরত দেয়।
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
Car
। instanceof
অপারেটর যদি ডান প্রতীক এর প্রোটোটাইপ বস্তু (এইজন্য করে কাজ করে 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
উদাহরণগুলিতে পরিবর্তনশীল)।
এটি আমাদের জাভাস্ক্রিপ্টে সুপারক্লাস বা সাবক্লাসের মতো ধারণাগুলি প্রয়োগ করার অনুমতি দেয়।
যোগ বা সম্পাদনা করতে নির্দ্বিধায়। আরও একবার সম্পূর্ণ হয়ে গেলে আমি এটি একটি সম্প্রদায় উইকি বোধহয় করতে পারি।
আমি বিশ্বাস করি যে @ ম্যাথু ক্রামলে ঠিক বলেছেন। এইগুলি হল বৈশিষ্ট্যগুলি , গঠনের দিক যদি না হয়, সমতুল্য। আপনি যদি ফায়ারব্যাগ ব্যবহার করে তৈরি করা বস্তুগুলি new
দেখতে ব্যবহার করেন তবে দেখতে পাবেন যে সেগুলি একই। তবে, আমার পছন্দটি নিম্নলিখিত হবে। আমি অনুমান করছি যে এটি সি # / জাভাতে আমি যেভাবে অভ্যস্ত ছিল ঠিক তার মতোই মনে হয়। অর্থাৎ শ্রেণীর সংজ্ঞা দিন, ক্ষেত্র, নির্মাতা এবং পদ্ধতি নির্ধারণ করুন।
var A = function() {};
A.prototype = {
_instance_var: 0,
initialize: function(v) { this._instance_var = v; },
x: function() { alert(this._instance_var); }
};
সম্পাদনা বলতে এর অর্থ এই নয় যে ভেরিয়েবলের ক্ষেত্রটি ব্যক্তিগত ছিল, আমি কেবল জাভাস্ক্রিপ্টে আমার ক্লাস কীভাবে সংজ্ঞায়িত করব তা বোঝানোর চেষ্টা করছিলাম। এটি প্রতিফলিত করতে পরিবর্তনশীল নাম পরিবর্তন করা হয়েছে।
initialize
এবং x methods do not refer to the
_আইন্সটেন্স_ভার সম্পত্তি হিসাবে A
, তবে একটি বিশ্বব্যাপী। ব্যবহার করুন this._instance_var
যদি আপনি ব্যবহার করতে অভিপ্রেত _instance_var
একটি সম্পত্তির A
উদাহরণস্বরূপ।
অন্যান্য উত্তরে যেমন আলোচনা করা হয়েছে, এটি সত্যিই একটি পারফরম্যান্স বিবেচনা কারণ প্রোটোটাইপের ফাংশনটি প্রতিটি ইনস্ট্যান্টেশনের জন্য তৈরি হওয়া ফাংশনটির পরিবর্তে সমস্ত ইনস্ট্যান্টেশনের সাথে ভাগ করা হয়।
আমি এটি দেখানোর জন্য একটি জস্পফারফ একসাথে রেখেছি। ক্লাসটি ইনস্ট্যান্ট করতে যে সময় লাগে তার মধ্যে একটি নাটকীয় পার্থক্য রয়েছে, যদিও আপনি যদি অনেকগুলি উদাহরণ তৈরি করেন তবে এটি সত্যিই প্রাসঙ্গিক।