先鋪墊下原型規則: 1.所有的引用類型(數組,對象,函數)都具有對象特性,可自由擴展屬性(出了null外) 2.所有的引用類型(數組,對象,函數)都有一個__proto__屬性(隱式原型),屬性值是一個對象 3.所有的函數都有一個prototype屬性(顯示原型),屬性值是一個對象 4.所有的引用類 ...
先鋪墊下原型規則:
1.所有的引用類型(數組,對象,函數)都具有對象特性,可自由擴展屬性(出了null外)
2.所有的引用類型(數組,對象,函數)都有一個__proto__屬性(隱式原型),屬性值是一個對象
3.所有的函數都有一個prototype屬性(顯示原型),屬性值是一個對象
4.所有的引用類型(數組,對象,函數),__protot__屬性值指向他的構造函數的prototype屬性值(new出來對象自身的(__protot__)隱式原型就是他構造函數的(prototype)顯示原型)
5.當試圖去得到一個對象的某個屬性時,如果這個對象本身沒有這個屬性,那麼會去他的__proto__(即他的構造函數的prototype)中尋找
看例子:
例子中new出來的f對象是只有name屬性(第3行創建的)和printName屬性(第10行創建的),第15行中調用f.alertName.而alertName直接在f對象本身中是沒有的,那麼會去他的__proto__(即他的構造函數Foo的prototype)中尋找(在第5行)
這就引出了原型鏈
當我們訪問對象的一個屬性或方法時,它會先在對象自身中尋找,如果有則直接使用,
如果沒有則會去原型對象中尋找,一直往上找(像冒泡一樣),瀏覽器防止無限迴圈,找到最上層就是object了(祖先),再往上找就是null
拓展:
使用hasOwnProperty()方法來檢查該屬性是new出實例對象自身中含有的還是在原型中含有的,當對象自身中含有屬性時,會返回true,
對比in,使用in檢查對象中是否含有某個屬性時,如果對象中沒有但是原型中有,也會返回true,所以hasOwnProperty()更嚴格,