js原型是一個非常抽象的概念萨咳,但是在實際應(yīng)用中非常的廣泛,同時也是面試過程中非常容易碰到的問題,作者在這里通過自己對js原型的理解來理一理js原型鏈的相關(guān)概念济赎。
在JavaScript中除了null對象以外导狡,所有的對象都與另外一個對象相關(guān)聯(lián)约巷,而所謂的另一個對象就是這個對象的原型,而對象又從原型繼承屬性或方法烘豌。
例如函數(shù)在創(chuàng)建的時候就包含一個prototype屬性载庭,該屬性返回一個函數(shù)對象,包含函數(shù)的相關(guān)屬性廊佩,這個對象就是該函數(shù)的原型對象囚聚,可以通過function.prototype來獲得原型對象的引用:
var test=function(){};//聲明一個函數(shù)
console.log(test.prototype)//返回一個函數(shù)對象,該對象就是函數(shù)的原型對象
函數(shù)的原型包含了函數(shù)的相關(guān)屬性标锄,可以對其中的屬性進行增刪改查
test.prototype.content="1234";//新增函數(shù)屬性
console.log(test.content)//輸出1234
原型存在的意義就是其中包含的該函數(shù)的屬性可以被該函數(shù)實例化后的子對象繼承
var test_1=new test();//實例化一個test
console.log(test_1.content);//返回1234
同時js還內(nèi)置了一個方法hasOwnProperty用來判斷某一屬性是否是該函數(shù)對象的自有屬性
console.log(test_1.hasOwnProperty("content"))//返回false
那么理解了js原型的概念顽铸,在來看看什么是原型鏈
每一個原型對象中都包含一個構(gòu)造函數(shù)constructor和一個__proto__,該構(gòu)造函數(shù)用來引用該原型指向的的函數(shù)對象本身,該__proto__指向一個原型對象
console.log(test.prototype.constructor==test)//返回true
console.log(test.prototype.__proto__==Object.prototype)//返回true
這是一種循環(huán)引用料皇,直到__proto__的值返回null谓松,所有這一系列鏈接的原型對象就是所謂的原型鏈
以上就是作者對于原型鏈一點淺顯的理解