原型是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。