উত্তর:
মূল পার্থক্যটি হ'ল একটি কনস্ট্রাক্টর ফাংশনটি newকীওয়ার্ডের সাথে ব্যবহৃত হয় (যার ফলে জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে একটি নতুন অবজেক্ট তৈরি করে, thisসেই বস্তুর সাথে ফাংশনের মধ্যে সেট করে এবং বস্তুটি ফেরত দেয়):
var objFromConstructor = new ConstructorFunction();
কারখানার ফাংশনটিকে "নিয়মিত" ফাংশনের মতো বলা হয়:
var objFromFactory = factoryFunction();
তবে এটি "ফ্যাক্টরি" হিসাবে বিবেচিত হওয়ার জন্য এটি কোনও বস্তুর একটি নতুন উদাহরণ ফেরত পাঠানো দরকার: আপনি যদি এটি কেবল একটি বুলিয়ান বা কিছু ফিরিয়ে দেন তবে আপনি এটি "ফ্যাক্টরি" ফাংশন বলবেন না। এটি স্বয়ংক্রিয়ভাবে এর মতো ঘটে না newতবে এটি কিছু ক্ষেত্রে আরও নমনীয়তার অনুমতি দেয়।
সত্যিই একটি সাধারণ উদাহরণে উপরে উল্লিখিত ফাংশনগুলি এর মতো দেখতে পারে:
function ConstructorFunction() {
this.someProp1 = "1";
this.someProp2 = "2";
}
ConstructorFunction.prototype.someMethod = function() { /* whatever */ };
function factoryFunction() {
var obj = {
someProp1 : "1",
someProp2 : "2",
someMethod: function() { /* whatever */ }
};
// other code to manipulate obj in some way here
return obj;
}
অবশ্যই আপনি ফ্যাক্টরি ফাংশনগুলি সেই সাধারণ উদাহরণের চেয়ে অনেক জটিল করে তুলতে পারেন।
কারখানার ফাংশনগুলির জন্য একটি সুবিধা হ'ল কিছু প্যারামিটারের উপর নির্ভর করে যখন বস্তুটি ফেরত দেওয়া হয় তখন বিভিন্ন ধরণের হতে পারে।
someMethodফিরে আসা জিনিসগুলির জন্য অন্তর্ভুক্ত নেই , এবং এটি এখানে কিছুটা কুয়াশাচ্ছন্ন হয়। কারখানার ফাংশনের অভ্যন্তরে, যদি কেউ কেবল এটি করে var obj = { ... , someMethod: function() {}, ... }, তবে প্রতিটি বস্তুর প্রত্যাবর্তন ঘটবে someMethodযার একটি অনুলিপি হ'ল এমন কিছু যা আমরা চাই না। ফ্যাক্টরি ফাংশন ব্যবহার newএবং prototypeঅভ্যন্তরে এটিই সহায়তা করবে।
newনির্মাণকারীর ফাংশনটি ব্যবহার করতে ভুলে যায় ; আমি ভেবেছিলাম যেখানে কারখানার কারখানার উদাহরণগুলির সাথে কনস্ট্রাক্টরগুলি কীভাবে প্রতিস্থাপন করা যায় এটির একটি দেখার প্রয়োজন হতে পারে এবং আমি মনে করি যে উদাহরণগুলিতে সামঞ্জস্যতা প্রয়োজন। যাইহোক, উত্তর যথেষ্ট তথ্যবহুল। এটি কেবলমাত্র একটি বিষয় যা আমি উত্থাপন করতে চেয়েছিলাম, তা নয় যে আমি কোনওভাবেই উত্তরটির মানের দিকে টানছি।
newঅভ্যন্তরীণভাবে ব্যবহার করতে পারেন , বা Object.create()একটি নির্দিষ্ট প্রোটোটাইপ দিয়ে একটি বস্তু তৈরি করতে ব্যবহার করতে পারেন ।
বেশিরভাগ বই আপনাকে কনস্ট্রাক্টর এবং ব্যবহার করতে শেখায় new
this নতুন বস্তু বোঝায়
কিছু লোক var myFoo = new Foo();পড়ার মতো পছন্দ করে ।
তাত্ক্ষণিকতার বিবরণ কলিং এপিআই-এ ( newপ্রয়োজনীয়তার মাধ্যমে ) ফাঁস হয়ে যায় , সুতরাং সমস্ত কলারগুলি কন্সট্রাক্টর বাস্তবায়নে দৃ tight়ভাবে মিলিত হয়। যদি কখনও কারখানার অতিরিক্ত নমনীয়তা প্রয়োজন হয়, আপনাকে সমস্ত কলারকে রিফ্যাক্টর করতে হবে (স্বীকৃতিস্বরূপ নিয়মের চেয়ে ব্যতিক্রমী কেস)।
ভুলে যাওয়া newএমন একটি সাধারণ বাগ, কনস্ট্রাক্টরকে সঠিকভাবে ডাকা হয়েছে কিনা তা নিশ্চিত করার জন্য আপনাকে বয়লারপ্লেট চেক যুক্ত করার জন্য দৃ strongly়তার সাথে বিবেচনা করা উচিত if (!(this instanceof Foo)) { return new Foo() }। সম্পাদনা: ES6 (ES2015) যেহেতু আপনি newকোনও classকনস্ট্রাক্টরের সাথে ভুলতে পারবেন না , বা নির্মাণকারী একটি ত্রুটি নিক্ষেপ করবে।
আপনি যদি instanceofচেকটি করেন তবে এটি newপ্রয়োজনীয় হবে কিনা তা নিয়ে অস্পষ্টতা ছেড়ে দেয় । আমার মতে, এটি হওয়া উচিত নয়। আপনি newপ্রয়োজনীয়ভাবে কার্যকরভাবে সংক্ষিপ্তসারিত করেছেন , যার অর্থ আপনি # 1 এর অপূর্ণতা মুছতে পারেন। তবে তারপরে আপনি অতিরিক্ত বয়লারপ্লেট, একটি মূলধনপত্র এবং কম নমনীয় thisপ্রসঙ্গ সহ নাম ব্যতীত কেবলমাত্র একটি কারখানার ফাংশন পেয়েছেন ।
তবে আমার প্রধান উদ্বেগ হ'ল এটি উন্মুক্ত / বদ্ধ নীতি লঙ্ঘন করে। আপনি কোনও কনস্ট্রাক্টর রফতানি শুরু করেন, ব্যবহারকারীরা কনস্ট্রাক্টর ব্যবহার শুরু করেন, তারপরে আপনি বুঝতে পারেন যে কোনও কারখানার নমনীয়তা প্রয়োজন তার পরিবর্তে (উদাহরণস্বরূপ, অবজেক্ট পুলগুলি ব্যবহার করতে বাস্তবায়নটি স্যুইচ করার জন্য, বা কার্যকরভাবে প্রাসঙ্গিক পরিবেশে ইনস্ট্যান্টিয়েট করার জন্য) প্রোটোটাইপাল ওও ব্যবহার করে উত্তরাধিকারের আরও নমনীয়তা থাকতে হবে)।
আপনি আটকে আছেন, যদিও। আপনার কনস্ট্রাক্টরকে কল করে এমন সমস্ত কোড না ভেঙে আপনি পরিবর্তন করতে পারবেন না new। উদাহরণস্বরূপ, পারফরম্যান্স লাভের জন্য আপনি অবজেক্ট পুলগুলি ব্যবহার করতে স্যুইচ করতে পারবেন না।
এছাড়াও, কনস্ট্রাক্টর ব্যবহার করে এমন একটি প্রতারণামূলক দেয় instanceofযা কার্যকরভাবে প্রাসঙ্গিকের কাজ করে না এবং আপনার কনস্ট্রাক্টর প্রোটোটাইপটি অদলবদল হয়ে গেলে কাজ করে না। আপনি যদি thisআপনার নির্মাণকারীর কাছ থেকে ফিরে আসা শুরু করেন , এবং তারপরে একটি নির্বিচার বস্তু রফতানি করতে স্যুইচ করেন তবে এটি আপনার কনস্ট্রাক্টরে কারখানার মতো আচরণ সক্ষম করতে আপনাকে করতে হবে It
কম কোড - কোনও বয়লারপ্লেটের প্রয়োজন নেই।
আপনি যেকোন স্বেচ্ছাচারিত বস্তুটি ফিরিয়ে দিতে পারেন এবং যেকোন স্বেচ্ছাসেবক প্রোটোটাইপ ব্যবহার করতে পারেন - আপনাকে একই ধরণের এপিআই প্রয়োগকারী বিভিন্ন ধরণের অবজেক্ট তৈরি করতে আরও নমনীয়তা দেয়। উদাহরণস্বরূপ, এমন একটি মিডিয়া প্লেয়ার যা এইচটিএমএল 5 এবং ফ্ল্যাশ প্লেয়ার উভয়েরই উদাহরণ তৈরি করতে পারে বা এমন ইভেন্ট লাইব্রেরি যা ডিওএম ইভেন্ট বা ওয়েব সকেটের ইভেন্টগুলি নির্গত করতে পারে। কারখানাগুলি কার্যকর কার্যকরকরণগুলি জুড়ে অবজেক্টগুলিও ইনস্ট্যান্ট করতে পারে, অবজেক্ট পুলগুলির সুবিধা নিতে পারে এবং আরও নমনীয় প্রোটোটাইপাল উত্তরাধিকারের মডেলগুলির জন্য মঞ্জুরি দেয়।
আপনার কারখানার কারখানা থেকে কনস্ট্রাক্টরে রূপান্তর করার দরকার নেই, তাই রিফ্যাক্টরিং কখনও সমস্যা হবে না।
ব্যবহার সম্পর্কে কোনও অস্পষ্টতা নেই new। না। (এটি thisখারাপ আচরণ করবে , পরের বিষয়টি দেখুন)।
thisআচরণ করবে যেমন স্বাভাবিকভাবে would - তাই আপনি (উদাহরণস্বরূপ পিতা বা মাতা বস্তুর অ্যাক্সেস করতে এটি ব্যবহার করতে পারেন, ভিতরে player.create(), thisবোঝায় player।, শুধু অন্য কোন পদ্ধতি would আবাহন মত callএবং applyএছাড়াও পুনঃস্থির this, প্রত্যাশিত হিসাবে আপনি পিতা বা মাতা বস্তুর উপর এগুলির নমুনা সংরক্ষণ, তাহলে সেই। কার্যকরভাবে কার্যকারিতা অদলবদল করার একটি দুর্দান্ত উপায় হতে পারে এবং আপনার অবজেক্ট ইনস্ট্যান্টেশনের জন্য খুব নমনীয় পলিমারফিজম সক্ষম করতে পারে।
পুঁজি করা বা না করা সম্পর্কে কোনও অস্পষ্টতা নেই। না। লিন্ট সরঞ্জামগুলি অভিযোগ করবে এবং তারপরে আপনি ব্যবহার করার চেষ্টা করতে প্ররোচিত হবেন newএবং তারপরে আপনি উপরে বর্ণিত সুবিধাটি পূর্বাবস্থায় ফিরিয়ে আনবেন।
কিছু মানুষ পছন্দ করেন var myFoo = foo();বা var myFoo = foo.create();পড়েন।
newআশানুরূপ আচরণ করে না (উপরে দেখুন)। সমাধান: এটি ব্যবহার করবেন না।
thisনতুন অবজেক্টের উল্লেখ নেই (পরিবর্তে, যদি কনস্ট্রাক্টরের সাথে ডট নোটেশন বা স্কোয়ার ব্র্যাকেট স্বরলিপি দেওয়া হয়, উদাহরণস্বরূপ foo.bar () - thisউল্লেখ করা হয় foo- ঠিক প্রতিটি অন্যান্য জাভাস্ক্রিপ্ট পদ্ধতির মতো - সুবিধা দেখুন)।
newমুক্ত / বদ্ধ নীতি লঙ্ঘন করে। এই মন্তব্যগুলির মঞ্জুরির চেয়ে আরও বড় আলোচনার জন্য মিডিয়াম.com/ জাভাস্ক্রিপ্ট- দৃশ্য / দেখুন দেখুন ।
newকীওয়ার্ড ছাড়াই এটি করে , আমি বিশ্বাস করি না যে newকীওয়ার্ডটি আসলে কোনও অতিরিক্ত পাঠযোগ্যতা সরবরাহ করে। আইএমও, কলকারীদের আরও বেশি টাইপ করতে সক্ষম করার জন্য হুপসের মধ্য দিয়ে ঝাঁপিয়ে পড়া নির্বোধ বলে মনে হয়।
একজন কনস্ট্রাক্টর আপনি যে শ্রেণীর উপর কল করেন সেটির একটি উদাহরণ দেয় returns একটি কারখানার ফাংশন যে কোনও কিছু ফিরিয়ে দিতে পারে। আপনি যখন স্বেচ্ছাসেবী মানগুলি ফিরিয়ে নিতে প্রয়োজন বা ক্লাসে একটি বড় সেটআপ প্রক্রিয়া থাকে তখন আপনি একটি কারখানা ফাংশন ব্যবহার করবেন।
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("Jack");
newপ্রোটোটাইপযুক্ত একটি অবজেক্ট তৈরি করে User.prototypeএবং Userতৈরি করা অবজেক্টের সাথে তার thisমান হিসাবে কল করে ।
new এটির অপারেন্ডের জন্য একটি আর্গুমেন্ট এক্সপ্রেশনটিকে expressionচ্ছিক হিসাবে বিবেচনা করে:
let user = new User;
কোন যুক্তি ছাড়াই newকল করতে হবে User।
newকনস্ট্রাক্টর কোনও বস্তুর মান ফেরত না দিলে এটি তৈরি করা বস্তুটি ফেরত দেয় , যা পরিবর্তে ফিরে আসে। এটি একটি প্রান্তের কেস যা বেশিরভাগ অংশে উপেক্ষা করা যায়।
কনস্ট্রাক্টর ফাংশন দ্বারা নির্মিত বস্তুগুলি কনস্ট্রাক্টরের সম্পত্তি থেকে সম্পত্তি অর্জন করে এবং কনস্ট্রাক্টর ফাংশনে অপারেটর prototypeব্যবহার করে সত্য ফিরে আসে instanceOf।
উপরের আচরণগুলি ব্যর্থ হতে পারে যদি আপনি prototypeইতিমধ্যে কনস্ট্রাক্টর ব্যবহারের পরে নির্মাণকারীর সম্পত্তির মান পরিবর্তন করে । এটি করা বিরল , এবং classকীওয়ার্ড ব্যবহার করে কনস্ট্রাক্টর তৈরি করা থাকলে এটি পরিবর্তন করা যাবে না ।
কনস্ট্রাক্টর ফাংশনগুলি extendsকীওয়ার্ড ব্যবহার করে বাড়ানো যেতে পারে ।
কনস্ট্রাক্টর ফাংশন nullত্রুটির মান হিসাবে ফিরে আসতে পারে না । যেহেতু এটি কোনও অবজেক্টের ডেটা টাইপ নয়, তাই এটি এড়ানো হবে new।
function User(name, age) {
return {
name,
age,
}
};
let user = User("Tom", 23);
এখানে ফ্যাক্টরি ফাংশন ছাড়া ডাকা হয় new। ফাংশন প্রত্যক্ষ বা অপ্রত্যক্ষ ব্যবহারের জন্য সম্পূর্ণরূপে দায়বদ্ধ যদি এর তর্কগুলি এবং এটির আকারটি ফিরে আসে। এই উদাহরণে এটি আর্গুমেন্ট থেকে সেট করা কিছু বৈশিষ্ট্য সহ একটি সাধারণ [অবজেক্ট অবজেক্ট] প্রদান করে।
কলার থেকে অবজেক্ট তৈরির বাস্তবায়ন জটিলতাগুলি সহজেই আড়াল করে। এটি একটি ব্রাউজারে নেটিভ কোড ফাংশনের জন্য বিশেষত কার্যকর।
কারখানার ফাংশনটিতে সর্বদা একই ধরণের জিনিসগুলি ফেরত দেওয়া উচিত নয় এবং এমনকি nullত্রুটি সূচক হিসাবে ফিরে আসতে পারে ।
সাধারণ ক্ষেত্রে, কারখানার ফাংশন কাঠামো এবং অর্থের পক্ষে সহজ হতে পারে।
প্রত্যাবর্তিত বস্তুগুলি সাধারণত কারখানার ফাংশনের prototypeসম্পত্তি থেকে উত্তরাধিকারী হয় না এবং falseএখান থেকে ফিরে আসে instanceOf factoryFunction।
মূলশব্দটি ব্যবহার করে কারখানার ফাংশনটি নিরাপদে বাড়ানো যায় না extendsকারণ বর্ধিত বস্তুগুলি কারখানার ফাংশন দ্বারা ব্যবহৃত কনস্ট্রাক্টরের prototypeসম্পত্তি পরিবর্তে কারখানার ফাংশন সম্পত্তি থেকে উত্তরাধিকারী হয় prototype।
কারখানাগুলি "সর্বদা" আরও ভাল। তখন অবজেক্ট ওরিয়েন্টেটেড ভাষা ব্যবহার করার সময়
বাস্তবায়নগুলি (নতুন দিয়ে তৈরি প্রকৃত বস্তুগুলি) কারখানার ব্যবহারকারী / গ্রাহক হিসাবে প্রকাশিত হয় না। এর অর্থ হ'ল কারখানা বিকাশকারী যতক্ষণ না চুক্তিটি ভঙ্গ করেন ততক্ষণ নতুন প্রবর্তন এবং প্রসার ঘটাতে পারে ... এবং এটি কারখানার গ্রাহককে তাদের কোড পরিবর্তন না করেই কেবল নতুন এপিআই থেকে উপকৃত হতে দেয় ... যদি তারা নতুন ব্যবহার করে এবং একটি "নতুন" বাস্তবায়ন আসে তবে তাদের যেতে হবে এবং "নতুন" ব্যবহারের জন্য "নতুন" ব্যবহার করা প্রতিটি লাইন পরিবর্তন করতে হবে ... কারখানায় তাদের কোড পরিবর্তন হয় না ...
কারখানা - অন্য যে কোনও কিছুর চেয়ে ভাল - বসন্তের কাঠামো পুরোপুরি এই ধারণার চারদিকে নির্মিত।
কারখানাগুলি বিমূর্তকরণের একটি স্তর এবং সমস্ত বিমূর্ততার মতো তাদের জটিলতাতে a.cost রয়েছে। কোনও ফ্যাক্টরি ভিত্তিক এপিআইয়ের মুখোমুখি হওয়ার সময় প্রদত্ত এপিআইয়ের জন্য কারখানাটি কী তা নির্ধারণ করে এপিআই গ্রাহক হয়ে উঠতে পারে। কনস্ট্রাক্টরগুলির সাথে আবিষ্কারের বিষয়টি তুচ্ছ।
সিটার এবং কারখানাগুলির মধ্যে সিদ্ধান্ত নেওয়ার সময় আপনার সিদ্ধান্ত নেওয়া দরকার যে সুবিধার দ্বারা জটিলতা ন্যায়সঙ্গত কিনা।
লক্ষণীয় যে জাভাস্ক্রিপ্ট নির্মাতারা এগুলি বা অপরিজ্ঞাত ব্যতীত অন্য কিছু ফিরিয়ে দিয়ে স্বেচ্ছাসেবী কারখানা হতে পারে। সুতরাং জেএসে আপনি উভয় বিশ্বের সেরা - আবিষ্কারযোগ্য এপিআই এবং অবজেক্ট পুলিং / ক্যাচিং পেতে পারেন।
new, পরিবর্তনের আচরণের thisপরিবর্তন, ফেরত মূল্য পরিবর্তন করা, একটি প্রোটোটাইপ রেফ সংযুক্ত করা, সক্ষম করা instanceof(যা মিথ্যা এবং এই উদ্দেশ্যে ব্যবহার করা উচিত নয়)। স্পষ্টতই, সেগুলি সমস্তই "বৈশিষ্ট্য"। অনুশীলনে, তারা আপনার কোডের মানের ক্ষতি করে hurt