函數(shù)對象
所有引用類型(函數(shù),數(shù)組,對象)都擁有__proto__屬性(隱式原型)
所有函數(shù)擁有prototype屬性(顯式原型)(僅限函數(shù))
?原型對象:擁有prototype屬性的對象荷辕,在定義函數(shù)時(shí)就被創(chuàng)建
1恢筝、談?wù)勀銓υ偷睦斫?/b>欢际?
在 JavaScript 中当窗,每當(dāng)定義一個(gè)對象(函數(shù)也是對象)時(shí)候,對象中都會包含一些預(yù)定義的屬性萄唇。其中每個(gè)函數(shù)對象都有一個(gè)prototype 屬性檩帐,這個(gè)屬性指向函數(shù)的原型對象,使用原型對象的好處是所有對象實(shí)例共享它所包含的屬性和方法另萤。
2湃密、什么是原型鏈?原型鏈解決的是什么問題四敞?
1)原型鏈解決的主要是繼承問題
2)每個(gè)對象擁有一個(gè)原型對象泛源,通過 proto 指針指向其原型對象,并從中繼承方法和屬性忿危,同時(shí)原型對象也可能擁有原型达箍,這樣一層一層,最終指向 null(Object.proptotype.__proto__指向的是null)癌蚁。這種關(guān)系被稱為原型鏈(prototype chain)幻梯,通過原型鏈一個(gè)對象可以擁有定義在其他對象中的屬性和方法
3)構(gòu)造函數(shù) Parent、Parent.prototype 和 實(shí)例 p 的關(guān)系如下:(p.__proto__ === Parent.prototype)
3努释、prototype 和?proto?區(qū)別是什么?
1)prototype是構(gòu)造函數(shù)的屬性
2)__proto__是每個(gè)實(shí)例都有的屬性咬摇,可以訪問 [[prototype]] 屬性
3)實(shí)例的__proto__與其構(gòu)造函數(shù)的prototype指向的是同一個(gè)對象
(prototype是“類”的原型伐蒂,__proto__是實(shí)例后的對象的原型。)
通俗點(diǎn)來講:
prototype是“類”的原型,__proto__是對象的原型肛鹏。js沒有類逸邦,只有constructor,constructor 就是你new fn()時(shí)候的那個(gè)"fn"
當(dāng)你new fn的時(shí)候,產(chǎn)生的實(shí)例的_proto_指向fn.prototype,這2個(gè)是同一個(gè)東西
```
function Foo(){}
var myfoo? = new Foo();
myfoo.__proto__? === Foo.prototype
```
1在扰、原型
①所有引用類型都有一個(gè)__proto__(隱式原型)屬性缕减,屬性值是一個(gè)普通的對象
②所有函數(shù)都有一個(gè)prototype(原型)屬性,屬性值是一個(gè)普通的對象
③所有引用類型的__proto__屬性指向它構(gòu)造函數(shù)的prototype
2芒珠、原型鏈
當(dāng)訪問一個(gè)對象的某個(gè)屬性時(shí)桥狡,會先在這個(gè)對象本身屬性上查找,如果沒有找到皱卓,則會去它的__proto__隱式原型上查找裹芝,即它的構(gòu)造函數(shù)的prototype,如果還沒有找到就會再在構(gòu)造函數(shù)的prototype的__proto__中查找娜汁,這樣一層一層向上查找就會形成一個(gè)鏈?zhǔn)浇Y(jié)構(gòu)嫂易,我們稱為原型鏈。