變更「原型」
重要性:5
在以下程式碼中,我們建立了 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 ); // ?
答案
-
真
.對
Rabbit.prototype
的賦值會為新物件設定[[Prototype]]
,但不會影響現有的物件。 -
假
.物件是透過參考來賦值的。來自
Rabbit.prototype
的物件並未複製,它仍然是一個單一物件,同時被Rabbit.prototype
和rabbit
的[[Prototype]]
參考。因此,當我們透過一個參考變更其內容時,會透過另一個參考看到變更。
-
真
.所有
delete
動作都會直接套用至物件。這裡的delete rabbit.eats
嘗試從rabbit
中移除eats
屬性,但它不存在。因此,此動作不會有任何效果。 -
未定義
.eats
屬性已從原型中刪除,它不再存在。