Q25. What is prototypal inheritance in JavaScript?
prototype chain কী, property কীভাবে খোঁজা হয় এবং class আসার পরও কেন এটি বোঝা জরুরি।
JavaScript-এ inheritance থাকে object থেকে object-এ। প্রতিটি object-এর একটি লুকানো prototype property থাকে, আর সেখান থেকে আরেকটি object-এর prototype — এভাবে চলতে থাকে। এই সূত্রকেই বলে prototype chain।
const animal = {
sound: "গর্জন",
speak() {
return this.name + " বলছে " + this.sound;
},
};
const dog = Object.create(animal); // animal-এর prototype
dog.name = "কুকু";
console.log(dog.speak()); // "কুকু বলছে গর্জন"
console.log(dog.hasOwnProperty("name")); // true — নিজের
console.log(dog.hasOwnProperty("sound")); // false — prototype থেকে এসেছেধাপে ধাপে — dog-এর নিজের কোনো speak নেই, তাই JavaScript প্রথমে dog খুঁজে দেখে, পায় না। তারপর dog-এর prototype অর্থাৎ animal-এ গিয়ে সেখানে speak পেয়ে যায় এবং সেটিকেই চালায়। তাই this হয় dog।
প্রতিটি object শেষে গিয়ে Object.prototype-এ পৌঁছায়, যেখান থেকে toString, hasOwnProperty এসব পাওয়া যায়।
const obj = {};
obj.toString !== Object.prototype.toString; // false
// খুঁজে বের করার চেইন
console.log(Object.getPrototypeOf(dog) === animal); // true
// একটা property খুঁজে বের করতে
console.log("speak" in dog); // true — chain-এর যেকোনো জায়গায়
console.log(dog.speak); // functionES6-এর class আসার পরেও ভিতরে একই prototype chain কাজ করে — শুধু লেখার ধরন পরিষ্কার হয়েছে।
class Animal {
constructor(name) {
this.name = name;
}
speak() {
return this.name + " শব্দ করছে";
}
}
class Dog extends Animal {
speak() {
return super.speak() + " (ঘেউ ঘেউ)";
}
}
const dog = new Dog("কুকু");
console.log(dog.speak()); // "কুকু শব্দ করছে (ঘেউ ঘেউ)"
// class-এর নিজস্ব prototype থাকে না
console.log(Object.getPrototypeOf(Dog) === Animal); // trueনতুন object তৈরির তিনটি উপায় — Object.create(proto), constructor function দিয়ে new, আর Object.assign(target, source)।
// assign দিয়ে মূল object না বদলে নতুন তৈরি
const base = { a: 1 };
const extended = Object.assign(Object.create(base), { b: 2 });
console.log(extended.a, extended.b); // 1 2| বিষয় | Prototype | Class |
|---|---|---|
| ভিত্তি | object | constructor function-এর উপর সাধারণ মোড়ক |
| তৈরি হয় | ES3 থেকে | ES6 থেকে |
| গতি | তুলনামূলক ধীর | আধুনিক V8-এ দ্রুত |
| ব্যবহার | পুরোনো কোড | আজকের কোড |
Prototype বদলে দিলে (obj.__proto__ = ...) পুরো অ্যাপে প্রভাব পড়ে, তাই Object.setPrototypeOf ব্যবহার করা উচিত নয় — পারফরম্যান্সের জন্য Object.create আগে থেকেই prototype ঠিক করে নিন।