Object Prototypes

جاوااسکریپت یک زبان مبتنی بر prototype است، یعنی اشیاء (Objects) می‌توانند از یکدیگر ویژگی‌ها و متدها را به ارث ببرند.

هر شیء در جاوااسکریپت یک ویژگی مخفی به نام [[Prototype]] دارد (که می‌توان با __proto__ به آن دسترسی پیدا کرد).

1️⃣ ساخت یک شیء ساده

const person = { name: "Ali", sayHello: function() { console.log("سلام " + this.name); } }; person.sayHello(); // سلام Ali

2️⃣ Prototype در فانکشن کانستراکتور

وقتی از constructor function استفاده کنیم، متدها بهتر است داخل prototype تعریف شوند تا همه اشیاء ساخته‌شده از آن، به صورت مشترک به متد دسترسی داشته باشند (و حافظه هدر نرود).

function Person(name, age) { this.name = name; this.age = age; } // تعریف متد روی prototype Person.prototype.sayHello = function() { console.log("سلام، من " + this.name + " هستم"); }; const p1 = new Person("Ali", 25); const p2 = new Person("Sara", 30); p1.sayHello(); // سلام، من Ali هستم p2.sayHello(); // سلام، من Sara هستم

👉 اینجا متد sayHello در حافظه فقط یکبار ساخته شده و همه اشیاء از طریق پروتوتایپ بهش دسترسی دارن.

3️⃣ زنجیره پروتوتایپ (Prototype Chain)

اگر یک ویژگی یا متد در خود شیء وجود نداشته باشد، جاوااسکریپت می‌رود و در پروتوتایپ شیء دنبالش می‌گردد.
این زنجیره ادامه پیدا می‌کند تا به Object.prototype برسیم.

console.log(p1.toString()); // متد toString در Person تعریف نشده // جاوااسکریپت میره سراغ Person.prototype // اونجا هم نبود → میره به Object.prototype

4️⃣ استفاده با class (سینتکس مدرن)

در ES6 به بعد، استفاده از class راحت‌تر شد ولی پشت‌صحنه همان prototype است.

class Person { constructor(name, age) { this.name = name; this.age = age; } sayHello() { console.log(`سلام، من ${this.name} هستم`); } } const p1 = new Person("Ali", 25); p1.sayHello(); // سلام، من Ali هستم

5️⃣ اضافه کردن متد جدید به Prototype حتی بعد از ساخت شیء

Person.prototype.sayAge = function() { console.log("سن من " + this.age + " سال است"); }; p1.sayAge(); // سن من 25 سال است

📌 نکات مهم

  • Prototype chain مثل وراثت کلاس‌ها در زبان‌های دیگر است.

  • تمام آبجکت‌ها در نهایت از Object.prototype ارث می‌برند.

  • استفاده از prototype باعث بهینه‌سازی حافظه می‌شود.

  • سینتکس class در واقع sugar syntax برای prototype است.