Q36. What is the difference between Object.create() and the new keyword?
দুটোই নতুন object বানায়, কিন্তু prototype কীভাবে ঠিক হয় এবং constructor কীভাবে চলে।
দুটোই নতুন object তৈরি করে, কিন্তু কাজের ধরন আলাদা। new একটি constructor function চালায় এবং সেটিকে prototype হিসেবে ব্যবহার করে, আর Object.create() শুধু prototype ঠিক করে দেয় — কোনো constructor চালায় না।
// new দিয়ে
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function () {
return this.name + " শব্দ করছে";
};
const dog = new Animal("কুকু");
console.log(dog.name); // "কুকু"
console.log(dog.speak()); // "কুকু শব্দ করছে"
console.log(dog instanceof Animal); // truenew চালালে তিনটি কাজ হয় — (১) খালি object বানানো হয়, (২) সেটার prototype দাঁড় করানো Animal.prototype করে দেওয়া হয়, (৩) Animal ফাংশনটি this পেয়ে চালানো হয় যাতে this.name বসে।
// Object.create দিয়ে — constructor চলে না
const proto = {
speak() {
return this.name + " শব্দ করছে";
},
};
const dog = Object.create(proto);
dog.name = "কুকু";
console.log(dog.speak());
console.log(dog.hasOwnProperty("name")); // true
console.log(dog instanceof proto); // trueধাপে ধাপে — Object.create(proto) বলে এমন একটি খালি object বানায় যার prototype হবে proto। তাই speak নিজের প্রপার্টি না হলেও prototype থেকে পাওয়া যায়। কিন্তু name কোনো constructor না চলার কারণে সেট হয়নি, তাই আমাদের নিজে বসাতে হলো।
দুটো মূল পার্থক্য এক নজরে।
| বিষয় | new | Object.create |
|---|---|---|
| Constructor চালায় | হ্যাঁ | না |
| নিজস্ব প্রপার্টি বসায় | constructor-ই বসায় | নিজে বসাতে হয় |
| ফেরত দেয় | নতুন object | নতুন object |
| প্রধান কাজ | class তৈরি | prototype ঠিক করা |
এই পার্থক্যটা খুব লাভজনক, কারণ Object.create(null) দিলে কোনো prototype থাকে না — তাই toString বা hasOwnProperty মতো inherited method ও থাকে না। এটি dictionary বা শুধু key-value রাখার জন্য নিরাপদ কাঠামো।
const dict = Object.create(null);
dict.name = "Rahim";
console.log(dict.name); // "Rahim"
console.log(dict.toString); // undefined — inherited নেই
console.log("toString" in dict); // false// class-এ new ছাড়া instance বানানো যায় না,
// তাই class ব্যবহার করলে new-ই লাগবে
class User {
constructor(name) {
this.name = name;
}
}
const a = new User("Rahim");
console.log(a); // User { name: "Rahim" }
console.log(a.constructor); // [class User]সাধারণ object বানাতে new ব্যবহার করুন, আর কোনো object-কে prototype হিসেবে দিতে বা prototype ছাড়া পরিষ্কার dictionary বানাতে Object.create ব্যবহার করুন। দুটোর ফলাফল প্রায় একই, কাজের পদ্ধতি আলাদা।