Javascript重温OOP之原型与原型链
prototype原型對象
每個函數(shù)都有一個默認的prototype屬性,其實際上還是一個對象,如果被用在繼承中,姑且叫做原型對象。
在構造函數(shù)中的prototype中定義的屬性和方法,會被創(chuàng)建的對象所繼承下來。舉個栗子:
function F(){} F.prototype.work = function(){console.log('F is working..'); }; var f = new F(); f.work(); // F is working..當你創(chuàng)建函數(shù)時,JS會為這個函數(shù)自動添加?prototype?屬性,值是空對象。而一旦你把這個函數(shù)當作構造函數(shù)(?constructor?)調用(即通過 new 關鍵字調用),那么JS就會幫你創(chuàng)建該構造函數(shù)的實例,實例繼承構造函數(shù)?prototype?的所有屬性和方法(實例通過設置自己的?__proto__?指向承構造函數(shù)的?prototype?來實現(xiàn)這種繼承)。
神秘的__proto__
JS的對象中都包含了一個__proto__屬性,其指向的是創(chuàng)建該對象時的構造函數(shù)的原型對象prototype。
從上面的輸出結果看出,f.__proto__指向了其構造函數(shù)F的prototype,而F.prototype本身也是一個對象,其內部也有__proto__屬性,其指向的是Object.prototype,直到最后Object.prototype指向null,這條原型鏈才結束。
因此,__proto__這個神秘的屬性才是原型鏈形成的真正原因。
原型鏈
由于原型對象本身也是對象,根據(jù)上邊的定義,它也有自己的原型,而它自己的原型對象又可以有自己的原型,這樣就組成了一條鏈,這個就是原型鏈,JavaScritp引擎在訪問對象的屬性時,如果在對象本身中沒有找到,則會去原型鏈中查找,如果找到,直接返回值,如果整個鏈都遍歷且沒有找到屬性,則返回undefined。原型鏈一般實現(xiàn)為一個鏈表,這樣就可以按照一定的順序來查找。
下面是一張經(jīng)典的圖:
從上圖看出:
Object.prototype是頂級對象,所有對象都繼承自它。
Function?繼承?Function?本身,?Function.prototype?繼承?Object.prototype?。
Function.prototype?和?Function.__proto__?都指向?Function.prototype
Object.prototype.__proto__?===?null?,說明原型鏈到?Object.prototype?終止。
總結
以上是生活随笔為你收集整理的Javascript重温OOP之原型与原型链的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: document.createDocum
- 下一篇: java美元兑换,(Java实现) 美元