1. 程式人生 > 其它 >js原型和繼承

js原型和繼承

1、引用型別,都具有物件特性,即可自由擴充套件屬性。

2、引用型別,都有一個隱式原型 __proto__ 屬性,屬性值是一個普通的物件。

3、引用型別,隱式原型 __proto__ 的屬性值指向它的建構函式的顯式原型 prototype 屬性值。

4、當你試圖得到一個物件的某個屬性時,如果這個物件本身沒有這個屬性,那麼它會去它的隱式原型 __proto__(也就是它的建構函式的顯式原型 prototype)中尋找。

在自定義建構函式時原型物件只會獲得constructor屬性,其他的都是從Object繼承而來,呼叫建構函式建立例項就是將例項的[[Prototype]]指標被賦值為建構函式的原型物件。[[Prototype]]

在指令碼中沒有訪問它的標準方式,但是瀏覽器提供了__proto__.

constructor屬性是原型的它會指回與之關聯的建構函式

個人理解:一般形式的物件陣列,引用型別,有的是__proto__指向它的原型,而建構函式它的是prototype屬性指向原型,這兩個都是指向原型的。

實列和建構函式是一級的(它兩更像是兄弟關係),它們指向同一個原型(建構函式通過prototype訪問,例項通過__proto__訪問)報錯的兩行是打錯了但是不影響

然後在看物件例項原型的原型

這是物件例項xiaoMing的原型的原型,也是Object的原型內建的,所有的例項物件建構函式即物件型別都是Object的例項

Object原型的的原型是null

Object實際只是一個概念,JavaScript這個語言基於物件,是說所有內建型別都被抽象出了一組公用的方法和屬性(也可以叫行為和狀態),我們就想像只擁有這些特性的一個東西就是Object

簡單的關係如下圖

當你呼叫物件例項的一個方法或者屬性會先查詢你自身有沒有,如果有就呼叫,如果沒有就查它的原型,如果還是沒有就查原型的原型直到null,還是沒有就報錯。