js-我對原型,原型鏈的理解

function Foo(name)
 {
     this.name=name;
 }
 let f1=new Person('小明');  //經過new操做符構造一個Person實例
 console.log(f1.name) // 小明複製代碼

  雖然是簡簡單單的兩行代碼,然而它們背後的關係倒是錯綜複雜的,以下圖所示:bash

看到上面的圖片,確定有人看不下去了,說實話,我剛開始看到這張圖片,我也不想看了,不過今天我會跟你們講清楚函數

1.這裏面有幾個重要屬性,你們必定得明白,prototype,_proto_,constructor,js裏萬物皆對象,其中,prototype(原型屬性)是函數所獨有的,_proto_和constructor屬性是對象所獨有的,因  爲函數也是對象,因此函數擁有以上三種屬性。ui

一:prototype(原型屬性)this

    這個屬性是函數獨有的,它是函數內部的一個指針,它指向一個原型對象 即 Person.prototype,這是構造函數的原型對象,它是從函數指向對象它的spa

做用
    就是包含能夠由特定類型的全部實例共享的屬性和方法,也就是讓該函數所實例化的對象們均可以找到公用的屬性和方法,再簡而言之就是這裏面的屬性是共享的

 二:_proto_(這是一個隱藏的屬性)prototype

由上圖你們能夠看到: f1._proto_===Foo.prototype Foo()._proto_===Function.prototype指針

它是從對象指向對象,它指向父級的原型對象,在建立實例對象時,實例在調用屬性或者方法時會先去構造函數內部尋 找,若是沒找到,實例對象就會去_proto_屬性所指向的父級原型對象上尋 找,f1._proto_===Foo.prototype若是仍是沒有則繼續往上找(這就是一條原型鏈) 即Foo.prototype._proto_===Object.prototype,若是仍是沒有就繼續往上,Object.prototype._proto_===null,直到尋找到原型鏈的頂端nullcode

 三:constructor(構造函數屬性)cdn

這是一個構造函數屬性,它指向一個函數:f1.constructor===Foo.prototype.constructor===Foo()對象

   Foo().constructor===Function();

  1. 總結一下:
  2. 咱們須要牢記兩點:①__proto__constructor屬性是
    對象
    所獨有的;② prototype屬性是
    函數
    所獨有的,由於函數也是一種對象,因此函數也擁有__proto__constructor屬性。
  3. __proto__屬性的
    做用
    就是當訪問一個對象的屬性時,若是該對象內部不存在這個屬性,那麼就會去它的__proto__屬性所指向的那個對象(父對象)裏找,一直找,直到__proto__屬性的終點
    null
    ,而後返回undefined,經過__proto__屬性將對象鏈接起來的這條鏈路即
    咱們所謂的原型鏈

  4. prototype屬性的
    做用
    就是讓該函數所實例化的對象們均可以找到公用的屬性和方法,即f1.__proto__ === Foo.prototype
  5. constructor屬性的含義就是
    指向該對象的構造函數
    ,全部函數(此時當作對象了)最終的構造函數都指向
     Function
  6. 初學者可能會在何謂指向上困惑,所謂指向不過就是一個代稱或者叫別名也好,好比一我的

     叫默罕默德.思哈尼.阿爾辛曼,這尼瑪名字太長了吧,咱管他叫默,這是就叫指向它,二者等價
相關文章
相關標籤/搜索