تغییر "prototype"
در کد زیر new Rabbit را ایجاد میکنیم و سپس سعی میکنیم پروتوتایپ آن را تغییر دهیم.
در شروع، ما این کد را داریم:
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
alert( rabbit.eats ); // true
-
یک رشته دیگر اضافه کردیم (تاکید شده). اکنون
alertچه چیزی را نشان میدهد؟function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); Rabbit.prototype = {}; alert( rabbit.eats ); // ? -
…و اگر کد به این صورت باشد (یک خط جایگزین شده است)؟
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); Rabbit.prototype.eats = false; alert( rabbit.eats ); // ? -
و مثل این (یک خط جایگزین شده است)؟
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete rabbit.eats; alert( rabbit.eats ); // ? -
آخرین نوع:
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete Rabbit.prototype.eats; alert( rabbit.eats ); // ?
پاسخها:
-
true.انتساب به
Rabbit.prototype،[[Prototype]]را برای اشیاء جدید تنظیم میکند، اما بر موارد موجود تأثیری نمیگذارد. -
false.اشیاء با مرجع تخصیص داده میشوند. شیء
Rabbit.prototypeتکراری نیست، همچنان یک شیء واحد است که هم توسطRabbit.prototypeو هم توسط[[Prototype]]ازrabbitارجاع داده شده است.بنابراین وقتی محتوای آن را از طریق یک مرجع تغییر میدهیم، از طریق مرجع دیگر قابل مشاهده است.
-
true.تمام عملیات
deleteمستقیماً روی شیء اعمال میشود. در اینجاdelete rabbit.eatsسعی میکند ویژگیeatsرا ازrabbitحذف کند، اما آن را ندارد. بنابراین عملیات هیچ تاثیری نخواهد داشت. -
undefined.ویژگی
eatsاز پروتوتایپ حذف شده است، دیگر وجود ندارد.