Q37. What is the difference between own properties and inherited properties?
নিজের প্রপার্টি বনাম prototype থেকে পাওয়া প্রপার্টি — চেনার উপায় ও গুরুত্ব।
Own property হলো যেটা object-এর উপর নিজে থেকেই আছে। আর inherited property হলো যেটা object-এর নিজের নয়, বরং prototype chain ধরে উপরের কোনো object থেকে এসেছে।
const animal = {
sound: "গর্জন",
};
const dog = Object.create(animal);
dog.name = "কুকু";
// নিজের প্রপার্টি
console.log(dog.hasOwnProperty("name")); // true
console.log(dog.hasOwnProperty("sound")); // false — inherited
// inherited property ও পড়া যায়
console.log(dog.sound); // "গর্জন"
console.log(dog.hasOwn("sound")); // falseধাপে ধাপে — dog-এর prototype হলো animal, তাই sound prototype chain ধরে পাওয়া যায়। কিন্তু name সরাসরি dog-এ বসানো, তাই সেটা own property। পড়ার সময় দুটোই কাজ করে, শুধু hasOwnProperty দিয়ে আলাদা করা যায়।
in অপারেটর আর hasOwnProperty এক জিনিস নয় — in চেক করে prototype chain-ও, আর hasOwnProperty শুধু নিজেরটা দেখে।
console.log("sound" in dog); // true — chain-এ আছে
console.log(dog.hasOwnProperty("sound")); // false
console.log("fly" in dog); // false
console.log(dog.hasOwnProperty("fly")); // falseপ্রোটোটাইপের সাধারণ method-গুলোও inherited — তাই dog.toString() কাজ করে, অথচ dog-এর নিজের toString নেই।
console.log(dog.toString()); // কাজ করে
console.log(dog.hasOwnProperty("toString")); // false
console.log(Object.getPrototypeOf(dog) === animal); // true// তিন ধরনের method
console.log("name" in dog); // true
console.log(Object.hasOwn(dog, "name")); // true
console.log(typeof dog.toString); // "function"
console.log(dog.hasOwnProperty("toString")); // falseএই পার্থক্য বাস্তবে দরকার হয় লুপ চালানোর সময়। for...in inherited property-ও ঘুরে দেখায়, তাই নিজের প্রপার্টি ছাঁকতে hasOwnProperty দিয়ে চেক করতে হয়।
const parent = { shared: true };
const child = Object.create(parent);
child.own = true;
for (const key in child) {
console.log(key); // "own", "shared" — দুটোই আসে
}
for (const key in child) {
if (child.hasOwnProperty(key)) {
console.log(key); // শুধু "own"
}
}// আরও নিরাপদ — hasOwn ও safe
console.log(Object.hasOwn(child, "shared")); // false
console.log(Object.prototype.hasOwnProperty.call(child, "shared")); // false| বিষয় | Own property | Inherited property |
|---|---|---|
| কোথায় | object-এর নিজের উপর | prototype-এ |
hasOwnProperty | true | false |
for...in-এ আসে | হ্যাঁ | হ্যাঁ |
JSON.stringify-এ | থাকে | থাকে না |
hasOwnProperty নিজেই একটি inherited method, তাই object-এ hasOwnProperty নামে কোনো প্রপার্টি থাকলে সরাসরি কল করলে error হতে পারে। আধুনিক Object.hasOwn(obj, key) ব্যবহার করলে এই ঝামেলা থাকে না।