千鋒教育JavaScript全套視頻教程(10天學(xué)會Js,前端javascrip

# 原型及繼承
### 原型
#### 概述
原型是一個公共的對象空間,它里面可以儲存對應(yīng)的公共屬性及方法.
#### 構(gòu)造函數(shù)的缺陷
```js
function Person(name){
??this.name = name
??this.sayHello = ()=>{
????console.log('hello')
??} // this.sayHello = new Function.log('hello')
}
// 實(shí)例化對象
let person1 = new Person('jack')
let person2 = new Person('jack')
console.log(person1 == person2) // false
console.log(person1.name == person2.name) // true
console.log(person1.sayHello == person2.sayHello) // false
```
構(gòu)造函數(shù)內(nèi)如果去指定方法那么對應(yīng)的每次實(shí)例化都會開辟專門的函數(shù)空間去存儲對應(yīng)的操作代碼.那沒救意味著我們實(shí)例化的對象越多,需要開辟的函數(shù)救越多,而這些函數(shù)內(nèi)的操作都是一致,這就會造成對應(yīng)的資源浪費(fèi).那么就會損耗對應(yīng)的效率.那么解決這個問題我們就可以利用一個公共空間去存儲對應(yīng)的函數(shù),那么這些函數(shù)找到的地址就是一個.而這個公共空間的名字就是原型.
**一般函數(shù)儲存在原型上,屬性儲存在構(gòu)造函數(shù)內(nèi)**
#### 函數(shù)的原型
`prototype`是函數(shù)內(nèi)的一個公共空間,它是一個對象.它屬于函數(shù)的本事,它屬于函數(shù)本事,它被稱為顯示原型.
**解決構(gòu)造函數(shù)的缺陷,就是將對應(yīng)的函數(shù)存放在對應(yīng)的原型上**
###### 注意事項(xiàng)
- 原型上具備`constructor`屬性 這個屬性指向?qū)?yīng)的構(gòu)造函數(shù)
- 原型上的屬性 可以使用實(shí)例化對象可以直接訪問
- class更c(diǎn)onstructor一級的函數(shù)都是存放在原型上的
- 原型上一般儲存對應(yīng)的函數(shù),構(gòu)造函數(shù)上一般儲存對應(yīng)的屬性
### 對象的原型
`__proto__`是屬于對象的原型,實(shí)例化對象也是對象所有它同樣存在.他指向*其構(gòu)造函數(shù)的原型*,他被稱為隱私原型.
#### 示例
```js
// __proto__是對應(yīng)的對象的一個公共空間
console.log(new Person().__proto__)
// 對象的原型指向其構(gòu)造函數(shù)的原型
console.log(new Person().__proto__ === Person.prototype) // true
```
#### 實(shí)現(xiàn)new方法
```js
// new方法實(shí)現(xiàn)
// 傳入對應(yīng)的構(gòu)造函數(shù)及參數(shù)
function myNew(fn,...arg){
??// 自動構(gòu)建對象 (將當(dāng)前的對象原型指向?qū)?yīng)的構(gòu)造函數(shù))
??let obj = {}
??obj.__proto__ = fn.prototype // 顯示類型
??// 傳入?yún)?shù)執(zhí)行構(gòu)造函數(shù) (填充屬性 屬性賦值)將當(dāng)前構(gòu)造的對象替代里面的this
??fn.apply(obj,obj) // 屬性賦值
??// 自動返回構(gòu)造的對象
??return obj
???
}
let newPerson = myNew(Person)
```
###### 注意事項(xiàng)
`__proto__`指向其構(gòu)造函數(shù)的prototype
`__proto__`非javaScript標(biāo)準(zhǔn)(瀏覽器支持)
##### 問題
對象的原型為__proto__,它指向?qū)?yīng)構(gòu)造函數(shù)的prototype.這個構(gòu)造函數(shù)的prototype也是一個對象,那么它同樣也具備對應(yīng)的__proto__,那么對應(yīng)的構(gòu)造函數(shù)的原型對象的__proto__又指向誰?
**對應(yīng)的指向從當(dāng)前的構(gòu)造函數(shù)的prototype一直到null為止 而這個指向的過程其實(shí)是就原型鏈查找的過程**
### 原型鏈
在原型向上查找屬性的過程構(gòu)成的鏈條(不斷在__proto__查找)稱為原型鏈
##### 原型鏈的查找過程
- 查找自身的__proto__是否具備屬性找到就返回屬性值
- 不斷向上查找對應(yīng)的父類構(gòu)造函數(shù)的prototype是否具備這個屬性 找到返回值
- 一直查到Object的prototype上是否具備這個屬性 找到返回屬性值
- 如果Object的prototype上還沒有找到就會去找null 返回undefined