前端面試題 - 說(shuō)一下原型和原型鏈?
JavaScript 中,萬(wàn)物皆對(duì)象,對(duì)象分為普通對(duì)象和函數(shù)對(duì)象。
所有的函數(shù)都是函數(shù)對(duì)象(typeof f === 'function'),其他都是普通對(duì)象(typeof o === 'object')。
JS在沒(méi)有類(lèi)class前,創(chuàng)建一個(gè)對(duì)象都是通過(guò) new 函數(shù)() 來(lái)實(shí)現(xiàn)的(也就是構(gòu)造函數(shù)),例如:
var a = new Object() // 此時(shí)a是{}
var a = {} // 等價(jià)于 var a = new Object()
function b() {}
var a = new b() // 此時(shí)a是{}
在 JavaScript 中,每當(dāng)定義一個(gè)對(duì)象(函數(shù)也是對(duì)象)時(shí)候,對(duì)象中都會(huì)包含一些預(yù)定義的屬性。
其中每個(gè)函數(shù)對(duì)象都有一個(gè)prototype 屬性,這個(gè)屬性就是所謂的原型對(duì)象。
可以把原型對(duì)象是函數(shù)內(nèi)維護(hù)的一個(gè)對(duì)象模版,當(dāng) new 函數(shù)() ,就會(huì)把這個(gè)對(duì)象拷貝一份返回新對(duì)象,這樣就完成了對(duì)象初始化,例如:
function b() {
b.prototype.c = 1
this.d = '2' // 在構(gòu)造函數(shù)里,this指向b.prototype
}
var a = new b() // 此時(shí)a為{c: 1, d: '2'}
另外,JS 在創(chuàng)建對(duì)象(不論是普通對(duì)象還是函數(shù)對(duì)象)的時(shí)候,都有一個(gè)叫做__proto__的內(nèi)置預(yù)定義屬性,
用于指向創(chuàng)建它的構(gòu)造函數(shù)的原型對(duì)象,例如在上面??的例子中,a.__proto__ === b.prototype。
每個(gè)對(duì)象都有__proto__屬性,但只有函數(shù)對(duì)象才有 prototype 屬性。
每個(gè)對(duì)象都有constructor(構(gòu)造函數(shù))屬性,這個(gè)屬性指向 prototype 屬性所在的函數(shù),
例如在上面??的例子中,a.constructor === b.prototype.constructor === b。
注意
Function.prototype是函數(shù)對(duì)象,但沒(méi)有prototype屬性,即Function.prototype.prototype === undefined,算是一個(gè)偏門(mén)知識(shí)點(diǎn)吧。
原型鏈:在多重繼承中,一個(gè)對(duì)象可以是原型的拷貝,同時(shí)也是另一個(gè)對(duì)象的原型。
因此,當(dāng)你嘗試訪問(wèn)對(duì)象上的屬性時(shí),JavaScript引擎開(kāi)始從對(duì)象自身中查找該屬性,
如果沒(méi)有,它會(huì)繼續(xù)檢查_(kāi)_proto__,一直到?jīng)]有__proto__或者找到該屬性。
如果找到最后,此屬性不存在時(shí),返回undefined。
原型鏈的最上層是
Object.prototype
通俗易懂的前端面試題網(wǎng)站: https://www.front-interview.com
posted on
浙公網(wǎng)安備 33010602011771號(hào)