初始原型鏈(二)

昨天,介紹了原型、原型鏈以及從一個實例化對象 cat 探尋原型鏈的祕密,今天咱們從 Animal 出發,探究 Animal 所在的原型鏈。javascript

Animal 的原型鏈java

昨天咱們經過代碼生成一個 Animal 類:git

 function Animal( name){
        this.name = name;
        this.say = function (){
            console.log("hello cat!");
        }
    }

咱們說對象都有__proto__屬性,那麼 Animal 也有啊!Animal 的原型是什麼?github

不知道你們有沒有這樣在瀏覽器中試驗過:瀏覽器

 function A(){}
 typeof A

  

對!就是這樣。一個函數的類型就是 function,那麼它應該是由 Function 構造而來。函數

也就是:Animal.__proto__ == Function.prototypethis

Function.prototype 是個對象,應該由 Object 構造,因此 Function.prototype.__proto__ == Object.prototype es5

最後,原型鏈的終點指向 null,  Object.prototype.__proto__ == nullprototype

總結3d

對於 Animal 函數而言,其原型鏈上的關係有:

1. Animal 是一個函數,由 Function 構造,因此有:Animal.__proto__ == Function.prototype

2. Function.prototype是一個對象,由 Object 構造,因此有:Function.prototype.__proto__ == Object.prototype 

3. 原型鏈的終點指向 null,因此有:Object.prototype == null

也就是:

Animal.__proto__.__proto__.__proto__ == null

圖示:

內置構造器對象與  Animal

js內置的構造器對象有12個(ES5中新加了JSON),可列舉的構造器的原型鏈結構同 Animal 同樣:

由於其實它們是js內置的構造對象, Animal 是咱們自定義的構造對象,原理是同樣的。

prototype 和 __proto__

 能夠看到上圖中,Function 有 prototype 和 __proto__ 兩個屬性,它們有什麼區別呢?

__proto__是對象的屬性,而 prototype 是函數的屬性,萬物皆對象,函數也是對象,因此函數也有 __proto__ 屬性,可是不是全部對象都有 prototype 哦!

舉個例子:

看,我建立一個對象 obj, obj有__proto__, 卻沒有 prototype。

而我建立一個函數,這個函數就既有__proto__,也有 prototype。

有沒有既沒有__proto__也沒有 prototype的對象?有!

既沒有__proto__也沒有 prototype的對象

以前提到,經過 Object.create(null)生成一個沒有原型屬性的對象,這個對象就既沒有__proto__也沒有 prototype。

後記

這是我對原型鏈知識的一點理解和見解,若有錯誤的理解或表述,歡迎你們指出,接下來我會繼續探究原型鏈知識,請繼續關注初始原型鏈系列博文,感謝你們的支持!

 如需轉載,請指明出處,素質轉載,謝謝。

相關文章
相關標籤/搜索