ইনহেরিট্যান্স হলো ক্লাসগুলোর মধ্যে প্যারেন্ট-চাইল্ড সম্পর্ক তৈরির একটি উপায়। চাইল্ড ক্লাসের (যাকে কখনও কখনও সাবক্লাস বলা হয়) কাছে প্যারেন্ট ক্লাসের (যাকে কখনও কখনও সুপারক্লাস বলা হয়) ডিফাইন করা আচরণ ও ডেটায় অ্যাক্সেস থাকে।
class Pet {
constructor(name) {
this.name = name;
}
introduce() {
console.log(`This is my pet, ${this.name}.`);
}
}
class Dog extends Pet {}
const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.
চাইল্ড ক্লাস ডিক্লারেশনে extends কিওয়ার্ডটি প্রোটোটাইপ চেইন-এর মাধ্যমে প্যারেন্ট ক্লাসের সাথে সম্পর্ক স্থাপন করে।
চাইল্ডের কনস্ট্রাক্টর দিয়ে তৈরি অবজেক্টগুলোর প্রোটোটাইপ চেইনে প্যারেন্ট ক্লাসের প্রোটোটাইপ থাকবে, ফলে প্যারেন্টের ডিফাইন করা যেকোনো মেথড বা ডেটায় অ্যাক্সেস মিলবে।
const dog = new Dog('Otis');
Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true
Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false
চাইল্ড ক্লাস যদি কোনো কনস্ট্রাক্টর ফাংশন ডিফাইন না করে, তবে প্যারেন্ট কনস্ট্রাক্টর ফাংশনটিই ব্যবহৃত হয়।
তবে চাইল্ড ক্লাস যদি নিজের একটি কনস্ট্রাক্টর ফাংশন ডিফাইন করে, তাহলে প্যারেন্ট কনস্ট্রাক্টরকে স্পষ্টভাবে কল করতে হবে।
চাইল্ড কনস্ট্রাক্টরের স্কোপের ভেতর থেকে প্যারেন্ট কনস্ট্রাক্টর কল করতে super কিওয়ার্ডটি ব্যবহার করা হয়।
class Pet {
constructor(name) {
this.name = name;
}
}
class Dog extends Pet {
constructor(name, breed) {
super(name);
this.breed = breed;
}
}
const dog = new Dog('Otis', 'Pug');
যেহেতু নতুন একটি অবজেক্ট ইনিশিয়ালাইজ করে সেটিকে this-এ অ্যাসাইন করার দায়িত্ব প্যারেন্ট কনস্ট্রাক্টরের, তাই চাইল্ড কনস্ট্রাক্টর this ব্যবহার করার আগেই সেটিকে কল করতে হবে।
class Dog extends Pet {
constructor(name, breed) {
// using 'this' before calling the parent constructor with 'super'
this.breed = breed;
super(name);
}
}
const dog = new Dog('Otis', 'Pug');
// => ReferenceError: Must call super constructor in derived class before accessing 'this'...
প্যারেন্ট থেকে ইনহেরিট করা আচরণের পাশাপাশি চাইল্ড ক্লাস নিজের আচরণও ডিফাইন করতে পারে।
ইনহেরিট্যান্স ব্যবহারের অন্যতম প্রধান কারণ এটিই; অর্থাৎ নিজস্ব আলাদা ডেটা ও মেথডসহ বিশেষায়িত চাইল্ড ক্লাস থাকবে, আর তারা প্যারেন্ট ক্লাসের দেওয়া অভিন্ন মেথড ও ডেটার মাধ্যমে সম্পর্কিত থাকবে।
class Dog extends Pet {
constructor(name, breed) {
super(name);
this.breed = breed;
}
describe() {
console.log(`${this.name} is a ${this.breed}.`);
}
}
const dog = new Dog('Otis', 'Pug');
dog.introduce();
dog.describe();
// => 'This is my pet, Otis.'
// => 'Otis is a Pug.'
চাইল্ড ক্লাস প্যারেন্টের ডিফাইন করা কোনো মেথডের আচরণ ওভাররাইডও করতে পারে, এবং তা চাইল্ড ক্লাসের ডিফাইন করা আচরণ দিয়ে প্রতিস্থাপন বা বর্ধিত করতে পারে।
class Cat extends Pet {
// replacing parent class behavior
introduce() {
console.log(`This is my cat, ${this.name}.`);
}
}
class Dog extends Pet {
constructor(name, breed) {
super(name);
this.breed = breed;
}
describe() {
console.log(`${this.name} is a ${this.breed}.`);
}
// extending parent class behavior
introduce() {
super.introduce();
this.describe();
}
}
const cat = new Cat('Milo');
cat.introduce();
// => 'This is my cat, Milo.'
const dog = new Dog('Otis', 'Pug');
dog.introduce();
// => This is my pet, Otis.
// => Otis is a Pug.
চাইল্ড ক্লাসের একই নামের কোনো মেথডের ভেতর থেকে প্যারেন্ট ক্লাসে ডিফাইন করা মেথড কল করতে হলে, প্যারেন্টকে রেফারেন্স করার জন্য super কিওয়ার্ডটি ব্যবহার করতে হবে।