যদিও এখানে অনেক লোক বলেছেন যে অবজেক্ট তৈরির জন্য সর্বোত্তম উপায় নেই, সেখানে জাভাস্ক্রিপ্টে ১৯৯৯ সালের মতো কেন অবজেক্ট তৈরি করার অনেক উপায় রয়েছে তা নিয়ে যুক্তি রয়েছে এবং এটি বিভিন্ন পুনরাবৃত্তির উপর জাভাস্ক্রিপ্টের অগ্রগতির সাথে কী করতে হবে? ইকমাস্ক্রিপ্ট 1997 এর পূর্ববর্তী প্রকাশের।
ECMAScript 5 এর পূর্বে অবজেক্ট তৈরির মাত্র দুটি উপায় ছিল: কনস্ট্রাক্টর ফাংশন বা আক্ষরিক স্বরলিপি (নতুন অবজেক্টের আরও ভাল বিকল্প ())। কন্সট্রাক্টর ফাংশন স্বরলিপি দিয়ে আপনি এমন একটি বস্তু তৈরি করেন যা একাধিক উদাহরণে ইনস্ট্যান্ট করা যায় (নতুন কীওয়ার্ড সহ), যখন আক্ষরিক স্বরলিপি একটি একক বস্তু সরবরাহ করে, যেমন সিঙ্গলটনের মতো।
// constructor function
function Person() {};
// literal notation
var Person = {};
আপনি যে পদ্ধতি ব্যবহার করুন না কেন, জাভাস্ক্রিপ্ট অবজেক্টগুলি কেবল মূল মান জোড়ার বৈশিষ্ট্য:
// Method 1: dot notation
obj.firstName = 'Bob';
// Method 2: bracket notation. With bracket notation, you can use invalid characters for a javascript identifier.
obj['lastName'] = 'Smith';
// Method 3: Object.defineProperty
Object.defineProperty(obj, 'firstName', {
value: 'Bob',
writable: true,
configurable: true,
enumerable: false
})
// Method 4: Object.defineProperties
Object.defineProperties(obj, {
firstName: {
value: 'Bob',
writable: true
},
lastName: {
value: 'Smith',
writable: false
}
});
জাভাস্ক্রিপ্টের প্রথম সংস্করণগুলিতে, শ্রেণিভিত্তিক উত্তরাধিকারের নকল করার একমাত্র আসল উপায় ছিল কনস্ট্রাক্টর ফাংশন ব্যবহার করা। কনস্ট্রাক্টর ফাংশন একটি বিশেষ ফাংশন যা 'নতুন' কীওয়ার্ডের সাহায্যে আহবান করা হয়। কনভেনশন দ্বারা, ফাংশন সনাক্তকারীকে মূলধন দেওয়া হয়, তবে এটি প্রয়োজন হয় না। কনস্ট্রাক্টরের ভিতরে, আমরা কনস্ট্রাক্টর ফাংশনটি স্পষ্টভাবে তৈরি করছে এমন অবজেক্টটিতে বৈশিষ্ট্য যুক্ত করতে 'এই' কীওয়ার্ডটি উল্লেখ করি। কনস্ট্রাক্টর ফাংশন স্পষ্টভাবে জনবহুল বৈশিষ্ট্য সহ নতুন বস্তুকে কলিং ফাংশনটিতে স্পষ্টভাবে ফিরিয়ে দেয়, যদি না আপনি স্পষ্টরূপে রিটার্ন কীওয়ার্ডটি ব্যবহার করেন এবং অন্য কোনও কিছু না ফেরান।
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.sayName = function(){
return "My name is " + this.firstName + " " + this.lastName;
}
}
var bob = new Person("Bob", "Smith");
bob instanceOf Person // true
SayName পদ্ধতিতে সমস্যা আছে। সাধারণত, অবজেক্ট-ওরিয়েন্টেড ক্লাস-ভিত্তিক প্রোগ্রামিং ভাষায়, আপনি অবজেক্ট তৈরি করতে কারখানা হিসাবে ক্লাস ব্যবহার করেন। প্রতিটি বস্তুর নিজস্ব ইন্সটেন্স ভেরিয়েবল থাকবে তবে ক্লাস ব্লুপ্রিন্টে সংজ্ঞায়িত পদ্ধতিগুলির কাছে এটির একটি পয়েন্টার থাকবে। দুর্ভাগ্যক্রমে, জাভাস্ক্রিপ্টের কনস্ট্রাক্টর ফাংশনটি ব্যবহার করার সময়, যতবারই এটি ডাকা হয়, এটি নতুন নির্মিত বস্তুর উপর একটি নতুন sayName সম্পত্তি সংজ্ঞায়িত করবে। সুতরাং প্রতিটি বস্তুর নিজস্ব অনন্য sayName সম্পত্তি থাকবে। এটি আরও মেমরির সংস্থান গ্রহণ করবে।
বর্ধিত মেমরি রিসোর্সগুলির পাশাপাশি, কনস্ট্রাক্টর ফাংশনের অভ্যন্তরের সংজ্ঞাগুলি উত্তরাধিকারের সম্ভাবনাটিকে সরিয়ে দেয়। আবার, পদ্ধতিটি সদ্য নির্মিত বস্তুর উপর সম্পত্তি হিসাবে সংজ্ঞায়িত করা হবে এবং অন্য কোনও বস্তু নেই, সুতরাং উত্তরাধিকার মতো কাজ করতে পারে না। সুতরাং, জাভাস্ক্রিপ্টটি উত্তরাধিকারের ফর্ম হিসাবে প্রোটোটাইপ শৃঙ্খলা সরবরাহ করে, জাভাস্ক্রিপ্টকে একটি প্রোটোটাইপাল ভাষা বানায়।
যদি আপনার পিতামাতা এবং পিতামাতারা কোনও সন্তানের অনেক সম্পত্তি ভাগ করে নেন তবে সন্তানের উচিত সেই সমস্ত সম্পত্তি inherit ES5 এর পূর্বে, এটি নিম্নরূপে সম্পন্ন হয়েছিল:
function Parent(eyeColor, hairColor) {
this.eyeColor = eyeColor;
this.hairColor = hairColor;
}
Parent.prototype.getEyeColor = function() {
console.log('has ' + this.eyeColor);
}
Parent.prototype.getHairColor = function() {
console.log('has ' + this.hairColor);
}
function Child(firstName, lastName) {
Parent.call(this, arguments[2], arguments[3]);
this.firstName = firstName;
this.lastName = lastName;
}
Child.prototype = Parent.prototype;
var child = new Child('Bob', 'Smith', 'blue', 'blonde');
child.getEyeColor(); // has blue eyes
child.getHairColor(); // has blonde hair
উপরের প্রোটোটাইপ চেইনটি আমরা যেভাবে ব্যবহার করেছি তাতে একটি গ্লাস রয়েছে। প্রোটোটাইপ হ'ল একটি সরাসরি লিঙ্ক, প্রোটোটাইপ শৃঙ্খলে একটি বস্তুর সম্পত্তি পরিবর্তন করে, আপনি অন্য কোনও অবজেক্টের একই সম্পত্তিও পরিবর্তন করবেন। স্পষ্টতই, কোনও সন্তানের উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতিটি পরিবর্তনের ফলে পিতামাতার পদ্ধতি পরিবর্তন করা উচিত নয়। Object.create একটি পলিফিল ব্যবহার করে এই সমস্যাটি সমাধান করেছে। সুতরাং, অবজেক্ট.ক্রিয়েট দিয়ে, আপনি প্রোটোটাইপ শৃঙ্খলে পিতামাতার একই সম্পত্তি প্রভাবিত না করে প্রোটোটাইপ শৃঙ্খলে কোনও সন্তানের সম্পত্তিটি নিরাপদে পরিবর্তন করতে পারবেন।
ECMAScript 5 অবজেক্ট তৈরির জন্য কনস্ট্রাক্টর ফাংশনে উল্লিখিত বাগটি সমাধান করার জন্য অবজেক্ট.ক্রেট চালু করেছে। অবজেক্ট.ক্রিয়েট () পদ্ধতিটি একটি বিদ্যমান অবজেক্টকে সদ্য নির্মিত বস্তুর প্রোটোটাইপ হিসাবে ব্যবহার করে একটি নতুন অবজেক্ট তৈরি করে। যেহেতু একটি নতুন অবজেক্ট তৈরি করা হয়েছে, আপনার আর সমস্যা নেই যেখানে প্রোটোটাইপ শৃঙ্খলেতে শিশু সম্পত্তি পরিবর্তন করে শৃঙ্খলে থাকা সেই সম্পত্তিটির জন্য পিতামাতার রেফারেন্সটি সংশোধন করা হবে।
var bobSmith = {
firstName: "Bob",
lastName: "Smith",
sayName: function(){
return "My name is " + this.firstName + " " + this.lastName;
}
}
var janeSmith = Object.create(bobSmith, {
firstName : { value: "Jane" }
})
console.log(bobSmith.sayName()); // My name is Bob Smith
console.log(janeSmith.sayName()); // My name is Jane Smith
janeSmith.__proto__ == bobSmith; // true
janeSmith instanceof bobSmith; // Uncaught TypeError: Right-hand side of 'instanceof' is not callable. Error occurs because bobSmith is not a constructor function.
ES6 এর আগে এখানে ফাংশন কনস্ট্রাক্টর এবং অবজেক্ট.ক্রিয়েটকে ব্যবহার করার জন্য একটি সাধারণ ক্রিয়েশনাল প্যাটার্ন ছিল:
const View = function(element){
this.element = element;
}
View.prototype = {
getElement: function(){
this.element
}
}
const SubView = function(element){
View.call(this, element);
}
SubView.prototype = Object.create(View.prototype);
এখন অবজেক্ট.ক্রিয়েট মিলিয়ে কনস্ট্রাক্টর ফাংশন জাভাস্ক্রিপ্টে অবজেক্ট তৈরি এবং উত্তরাধিকারের জন্য ব্যাপকভাবে ব্যবহৃত হয়েছে। তবে, ES6 ক্লাসগুলির ধারণাটি প্রবর্তন করেছে, যা জাভাস্ক্রিপ্টের বিদ্যমান প্রোটোটাইপ-ভিত্তিক উত্তরাধিকারের তুলনায় মূলত সিনট্যাকটিকাল চিনি। ক্লাস সিনট্যাক্স জাভাস্ক্রিপ্টে নতুন অবজেক্ট-ভিত্তিক উত্তরাধিকারের মডেল প্রবর্তন করে না। সুতরাং, জাভাস্ক্রিপ্ট একটি প্রোটোটাইপাল ভাষা থেকে যায়।
ES6 ক্লাস উত্তরাধিকার অনেক সহজ করে তোলে। আমাদের আর ম্যানুয়ালি প্যারেন্ট ক্লাসের প্রোটোটাইপ ফাংশনগুলি অনুলিপি করতে হবে না এবং শিশু শ্রেণির নির্মাতাটিকে পুনরায় সেট করতে হবে।
// create parent class
class Person {
constructor (name) {
this.name = name;
}
}
// create child class and extend our parent class
class Boy extends Person {
constructor (name, color) {
// invoke our parent constructor function passing in any required parameters
super(name);
this.favoriteColor = color;
}
}
const boy = new Boy('bob', 'blue')
boy.favoriteColor; // blue
সব মিলিয়ে জাভাস্ক্রিপ্টে অবজেক্ট ক্রিয়েশনের এই 5 টি ভিন্ন কৌশল ইকমাস্ক্রিপ্ট স্ট্যান্ডার্ডের বিবর্তনের সাথে মিলেছে।