>[danger] 原型鏈繼承
*****
參考:
1. JS中所有對象都是Object的實例, Object是所有對象的父親, 子類原型prototype指向父類實例對象實現繼承
```
Student.prototype = new Person();
```
2. 構造函數中, 使用call/apply實現繼承, 子類構造函數中, 父類.call(this), 父類.apply(this), 作用是: 讓Student內的this可以調用Person內的屬性和方法
```
function Student(){
// 區別:
Person.call(this); // call(this,arg1, arg2, arg3 )
Person.apply(this); // apply(this, [arg1, agr2, arg3])
}
Student.prototype = new Person();
```
擴展:
1. ES6 中引入了Class關鍵字, 轉換成ES5以后其實是原型鏈繼承
2. 每個new 出來的對象, 都擁有構造函數和prototype上的屬性和方法, 也可以通過原型鏈去查找繼承的屬性/方法
3. 可以利用prototype給系統類擴展屬性/方法
4. 原型繼承方式, 子類實例化, 無法給父類傳參, 但使用call可以給父類傳參
*****
>[danger] new 都干了什么
*****
new 構造函數, 會讓this指向一個全新Object對象,
```
var obj = {};
obj.__proto__ = Base.prototype; // 繼承原型里屬性/方法
Base.call(obj); // 繼承構造函數里屬性/方法
```
*****
>[danger] prototype 和 __proto__區別?
*****
1. 方法/類擁有, `__proto__` 和 `prototype`,
對象擁有`__proto__`
2. __proto__解釋:
* 一個對象的__proto__指向它構造函數的prototype的值,這也保證了實例能夠訪問在構造函數和prototype中定義的屬性和方法。
* 每個對象的__proto__屬性, 是查找方法/類/對象的原型鏈方式.
```
// b.__proto__ == Boy.prototype 為true (證明1那句話是對的)
// 原型的__proto__指向了它構造函數的prototype的值
```
*****
3. prototype 解釋:
(1) 方法除了__proto__還有prototype屬性, 指向該方法的原型對象。
總結: a.__proto__指向A.prototype 指向 new Person() 原型對象
>[danger]看下面代碼, 有什么問題?
~~~
function Person(){
this.name = "person";
this.grade = {
math: 0
}
}
function Student() {
}
Student.prototype = new Person();
let stu1 = new Student();
stu1.name = "100";
stu1.grade.math = 100;
let stu2 = new Student();
console.log(stu2.name); // name屬性沒有受到stu1的影響
console.log(stu2.grade.math); // 100 (很明顯2個實例對象竟然共享了父類引用類型的數據
console.log(stu2.grade === stu1.grade); // true
~~~
解決方式, 引入[組合繼承](%E7%BB%84%E5%90%88%E7%BB%A7%E6%89%BF.md)
- web前端
- CSS問題
- 布局
- 雙飛翼布局_flex方式
- 雙飛翼布局_margin方式
- 圣杯布局_flex方式
- 圣杯布局_margin方式
- 子元素居中問題
- 彈性布局
- 概念_
- 標準模式與混雜模式
- 各種FC
- line-height
- vertical-align
- CSS3新特性
- 效果
- div添加箭頭
- CSS繪制三角形
- JavaScript
- 兼容
- 事件相關
- 原理
- Ajax原理
- 繼承原理
- 原型鏈繼承
- 組合繼承
- 寄生組合繼承
- 數據綁定
- 1單向數據綁定m到c到v
- 2偽雙向數據綁定
- 3雙向數據綁定
- socket.io
- 運行時
- this指向
- 0.1+0.2問題
- 對象/數組-深拷貝&淺拷貝
- 事件循環
- typeof
- instanceof
- 概念
- 閉包
- 回調函數
- Promise
- 原生對象
- Attribute和property區別
- 防抖函數
- 節流函數
- 語言類型
- Vue
- Vue優缺點
- 仿Vue源碼
- 1數據綁定_Observe
- 2數據綁定_訂閱者&觀察者定義
- 3數據綁定_Vue類實現
- 4數據綁定_Vue訪問data更改
- 5DOM編譯_Compile_雙大括號模板講解
- 6DOM編譯_v-model講解
- 7DOM編譯_v-on:事件綁定講解
- 項目總結
- 使用Svg圖標
- vueCli環境_真機測試
- vueCli集成環信SDK
- 父子組件雙向綁定
- React
- React優缺點
- 我的組件庫
- Vue的組件庫
- 環信_聊天組件
- 面試題
- HTML_分類
- CSS_分類
- JavaScript_分類
- VueJS_分類
- ReactJS_分類
- AngularJS_分類
- 瀏覽器端
- 筆試題
- CSS
- 特殊布局
- JavaScript_
- 經典_宏任務_微任務
- 瀏覽器問題
- CORS
- web服務器
- Apache
- 開啟跨域
- Nginx
- 常用命令
- 正向代理
- 反向代理
- 負載均衡
- mac安裝Nginx
- 配置80端口
- 算法
- 冒泡排序
- 選擇排序
- 合并對象_排序
- 楊輝三角
- 紅黑樹
- 計算機基礎
- 網絡相關
- OSI七層模型
- http協議
- http工作原理
- https協議
- GET和POST區別
- hosts文件
- php相關
- session機制
- Linux
- 阿里云服務器
- linux使用Mysql
- 安裝mysql
- 導入.sql文件
- 遠程連接mysql
- linux使用xampp
- 安裝Xampp
- 配置web訪問
- 域名綁定服務器
- linux搭建git服務器_apache下
- 代碼管理
- 什么是git
- 命令行_使用git
- .gitignore文件講解
- 軟件
- VSCode的安裝
- 理財
- 基金
- 攝影