بازگشت به درس

تغییر "prototype"

اهمیت: 5

در کد زیر new Rabbit را ایجاد می‌کنیم و سپس سعی می‌کنیم پروتوتایپ آن را تغییر دهیم.

در شروع، ما این کد را داریم:

function Rabbit() {}
Rabbit.prototype = {
  eats: true
};

let rabbit = new Rabbit();

alert( rabbit.eats ); // true
  1. یک رشته دیگر اضافه کردیم (تاکید شده). اکنون alert چه چیزی را نشان می‌دهد؟

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype = {};
    
    alert( rabbit.eats ); // ?
  2. …و اگر کد به این صورت باشد (یک خط جایگزین شده است)؟

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype.eats = false;
    
    alert( rabbit.eats ); // ?
  3. و مثل این (یک خط جایگزین شده است)؟

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete rabbit.eats;
    
    alert( rabbit.eats ); // ?
  4. آخرین نوع:

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete Rabbit.prototype.eats;
    
    alert( rabbit.eats ); // ?

پاسخ‌ها:

  1. true.

    انتساب به Rabbit.prototype ،[[Prototype]] را برای اشیاء جدید تنظیم می‌کند، اما بر موارد موجود تأثیری نمی‌گذارد.

  2. false.

    اشیاء با مرجع تخصیص داده می‌شوند. شیء Rabbit.prototype تکراری نیست، همچنان یک شیء واحد است که هم توسط Rabbit.prototype و هم توسط [[Prototype]] از rabbit ارجاع داده شده است.

    بنابراین وقتی محتوای آن را از طریق یک مرجع تغییر می‌دهیم، از طریق مرجع دیگر قابل مشاهده است.

  3. true.

    تمام عملیات delete مستقیماً روی شیء اعمال می‌شود. در اینجا delete rabbit.eats سعی می‌کند ویژگی eats را از rabbit حذف کند، اما آن را ندارد. بنابراین عملیات هیچ تاثیری نخواهد داشت.

  4. undefined.

    ویژگی eats از پروتوتایپ حذف شده است، دیگر وجود ندارد.