首先看兩段很相似的代碼: 1. 2. 兩個例子都是重寫了原型對象,但是實例創建的順序直接導致了倆個輸出的結果。 第一個彈出 “Nic”,而第二個會報錯“TypeError: friend2.sayName is not a function” !!! 兩端代碼唯一的區別就是實例在原型對象重寫之前還是 ...
首先看兩段很相似的代碼:
1.
function Person(){} Person.prototype = { constructor:Person, name:"Nic", age:"29", sayName:function(){ alert(this.name) } }; var friend1 = new Person(); //實例在這裡 friend1.sayName();
2.
function Person(){} var friend2 = new Person(); //實例在這裡 Person.prototype = { name : "aty", sayName:function(){ alert(this.name); } }; friend2.sayName();
兩個例子都是重寫了原型對象,但是實例創建的順序直接導致了倆個輸出的結果。
第一個彈出 “Nic”,而第二個會報錯“TypeError: friend2.sayName is not a function” !!!
兩端代碼唯一的區別就是實例在原型對象重寫之前還是之後。
第一段重寫後再創建實例,此時實例指向改寫後的原型對象,所以能調用到原型中的sayName()。
第二段創建實例後再重寫,此時實例還是指向剛開始的原型對象。重寫原型對象後會將 之前原型對象 的屬性和方法全部清除,所以實例訪問不到sayName()。
另外讀《JavaScript高級程式設計(第3版)》中156頁與157頁,分別是:
“實例中的指針僅指向原型,而不是指向構造函數”。
“重寫原型對象切斷了現有原型與任何之前已經存在的對象實例之間的關係;它們引用的仍然是最初的原型”。