原型與原型鏈

原型是JavaScript中一個比較難理解的概念,原型相關(guān)的屬性也比較多,對象有”prototype”屬性,函數(shù)對象有”prototype”屬性,原型對象有”constructor”屬性。

一、原型
在JavaScript中,原型也是一個對象,通過原型可以實現(xiàn)對象的屬性繼承,JavaScript的對象中都包含了一個”[Prototype]”內(nèi)部屬性,這個屬性所對應的就是該對象的原型。
“[Prototype]”作為對象的內(nèi)部屬性,是不能被直接訪問的。所以為了方便查看一個對象的原型,F(xiàn)irefox和Chrome中提供了proto這個非標準(不是所有瀏覽器都支持)的訪問器(ECMA引入了標準對象原型訪問器”O(jiān)bject.getPrototype(object)”)。在JavaScript的原型對象中,還包含一個”constructor”屬性,這個屬性對應創(chuàng)建所有指向該原型的實例的構(gòu)造函數(shù)。
二、規(guī)則
在JavaScript中,每個函數(shù) 都有一個prototype屬性,當一個函數(shù)被用作構(gòu)造函數(shù)來創(chuàng)建實例時,這個函數(shù)的prototype屬性值會被作為原型賦值給所有對象實例(也就是設置 實例的__proto__屬性),也就是說,所有實例的原型引用的是函數(shù)的prototype屬性。(只有函數(shù)對象才會有這個屬性!)

var 對象 = new 函數(shù)() 對象.proto === 對象的構(gòu)造函數(shù).prototype
// 推論
var number = new Number()
number.proto = Number.prototype
Number.proto = Function.prototype // 因為 Number 是 Function 的實例
var object = new Object()
object.proto = Object.prototype
Object.proto = Function.prototype // 因為 Object 是 Function 的實例
var function = new Function()
function.proto = Function.prototype
Function.proto == Function.prototye // 因為 Function 是 Function 的實例!

原型鏈圖解

原型鏈
因為每個對象和原型都有原型,對象的原型指向原型對象,
而父的原型又指向父的父,這種原型層層連接起來的就構(gòu)成了原型鏈。
所有原型鏈的終點都是Object函數(shù)的prototype屬性,因為在JavaScript中的對象都默認由Object()構(gòu)造。Object.prototype指向的原型對象同樣擁有原型,不過它的原型是null,而null則沒有原型。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容