什么是原型鏈?
原型鏈是一種查找規則
為對象成員查找機制提供一個方向
因為構造函數的 prototype 和其實例的 __ proto __ 都是指向原型對象的
所以可以通過__proto__
查找當前的原型對象有沒有該屬性,
沒有就找原型的原型, 依次類推一直找到Object( null ) 為止
這種鏈式查找過程稱之為原型鏈
什么是閉包?
閉包(closure)指有權訪問另一個函數作用域中變量的函數。簡單理解就是 ,一個作用
域可以訪問另外一個函數內部的局部變量。
function fn() {var num = 10;function fun() {console.log(num); }return fun;
}
var f = fn();
f();
優點: 延長變量作用域、在函數的外部可以訪問函數內部的局部變量,
缺點: 容易造成內層泄露,因為閉包中的局部變量永遠不會被回收 解決方法: 需要手動清除 把變量變為null
繼承
Call 式繼承繼承的是屬性,原型繼承繼承的是方法。
// #1 Call 式繼承 / 構造函數繼承:繼承的是屬性
Person.call(this, name, age)
// #2 原型繼承:繼承的是方法
Star.prototype = new Person()
Star.prototype.constructor = Star
將需要繼承的對象掛到當前對象的原型對象上面, 通過原型鏈訪問
子類的原型對象 = 父類的構造函數創建出的對象
特點:1、實例可繼承的屬性有:實例的構造函數的屬性,父類構造函數屬性,父類原型的屬性。(新實例不會繼承父類實例的屬性!
缺點:1、新實例無法向父類構造函數傳參。
2、繼承單一。
3、所有新實例都會共享父類實例的屬性。(原型上的屬性是共享的,一個實例修改了原型屬性,另一個實例的原 型屬性也會被修改!)
混合式繼承
-
遍歷父對象成員, 添加給子對象構造函數的原型
-
特點: 多個對象繼承, 不會覆蓋原來的默認原型
-
缺點: 代碼量增多
-
ES6 class類實現繼承 :
// 創建一個父類class father {// 在 constructor 里面定義實例constructor(house, car) {this.house = housethis.car = car}// 在外面定義方法sayHi() {console.log('你好啊')}}// 實例化 fatherconst f = new father('湯臣一品', '勞斯萊斯')console.log(f)// 子類繼承父類class son extends father {// 如果沒有提供構造函數, 在繼承時, 會默認自動借調父構造函數 constructor(house, car, study) {// 你寫的構造函數中, 沒有借調父構造函數super(house, car) // 觸發調用父構造函數, 進行實例的屬性初始化this.study = 'study'}work() {console.log('找樂子')}}// 實例化 sonconst s = new son('樂高一號', '跑跑卡丁車', '做美食')console.log(s)
通過class
聲明一個類,constructor()
作為構造函數,屬性在constructor()
中初始化
可以在class
內定義非靜態方法,靜態方法綁定在構造器上
類的所有方法都是不可枚舉的,也符合內部方法
實例化一個class
必須要new
關鍵字
extends
實現繼承,子類中調用super()
訪問父類構造函數