تغییر "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
از پروتوتایپ حذف شده است، دیگر وجود ندارد.