對於js原型和原型鏈繼承的簡單理解(第一種,原型鏈繼承)

 原型是js中的難點加劇點,也是前端面試官最愛問的問題之一,由於面試官能夠經過被面試者對原型的理解、來判斷被面試者對js的熟悉程度。前端

原型的定義面試

Js全部的函數都有一個prototype屬性,這個屬性引用了一個對象,即原型對象,也簡稱原型。這個函數包括構造函數和普通函數,咱們講的更可能是構造函數的原型,可是也不可否定普通函數也有原型。函數

先看一下普通函數的原型this

例如:spa

function animal(){
     
}
//這個函數就有原型屬性,引用的對象就是object

今天看了一個視頻,那位老師講的很清晰,在此感謝自學網的燕18老師!prototype

接下來,咱們經過一個構造函數的例子來了解原型。code

function animal(){
        this.name = function(){
            document.write("我有名字<br/>");
        }
    }
    function cat(){
        this.climb = function(){
            document.write("我會爬樹<br/>");
        }
    }
    function tiger(){
        this.type = function(){
            document.write("我是一直虎<br/>");
      }
    }
    cat.prototype = new animal();//這裏就是繼承
    tiger.prototype = new cat();
    var smtiger = new tiger();
   smtiger.climb();//這裏輸出「我會爬樹
  smtiger.name(); //這裏輸出「我有名字」

咱們new了一個對象小虎smtiger對象,並且在tiger的構造函數中只有一個type,它不會爬樹,也沒有名字;視頻

可是!!!經過原型,tiger繼承了cat,cat又繼承了animal,因此:小虎會爬樹,也有了名字。對象

 

js雖然沒有類,可是倒是面向對象的一門腳本語言,就是由於它能夠經過prototype來實現繼承blog

 

這樣只看表面很不切實際,也很難理解,接下來分析一下具體的prototype和_proto_的關係

 

一、tiger()構造函數new一個tiger對象--》這個對象的_proto_指向cat對象,tiger()構造函數的prototype指向cat對象;

二、cat()構造函數new一個cat對象--》這個對象的_proto_指向animal對象,cat()構造函數的prototype指向animal對象;

三、animal()構造函數new一個animal對象--》這個對象的_proto_指向一個普通的object(也就是js的object「我的理解」),animal()構造函數的prototype指向普通的object對象,這個object對象有constructor的構造函數,指向animal(),因此anima實際上是轉了一圈又回來指向本身,表現爲aniaml;

四、object()new一個obj對象--》這個對象的_proto_指向系統的object(應該就是window「我的理解」),object()的prototype指向系統的object對象;

五、系統的object對象指向null。

相關文章
相關標籤/搜索