復習
沒有class和extends,使用混合繼承
function Parent(name) {}
function Son(name,age) {
// 一: 調用父類
Parent.call(this,name)
this.age = age
}
// 二:繼承原型上方法 --- 不需要參數
Son.prototype = new Parent()
介紹
- 使用關鍵字
extends
- 子類的
constructor
必須要調用super
原型
- js中的繼承依舊是基于
prototype
- 對子類使用
Object.getPrototypeOf(SubClass)
的到是父類
super 關鍵字
-
super
作為函數
- 只能在構造函數中使用
-
super(param)
相當于Parent.prototype.constructor.call(Son,param)
-
super
作為對象
- 在非靜態方法中,
super
指的是父類原型 - 在靜態方法中,
super
指的是父類 - 通過
super
對象,調用父類方法,方法中的this
綁定子類的this
-
console.log(super)
報錯,因為無法判斷super
是對象還是函數 - 對象總是繼承對象,對象中可以直接使用
super
兩條繼承鏈
Son.__proto__ == Parent
Son.prototype.__proto__ == Parent.prototype
- 子類實例原型的原型指向父類實例的原型
p1.__proto__.__proto__ = p2.__proto__
原生構造函數的繼承
原生構造函數大致有,String,Number,Boolean,Array,Date,Function,Object,RegExp
- es5中不允許繼承原生構造函數,即使使用“混合繼承”的方式,新生成的類不會有原生構造函數的行為
- es6中允許繼承原生構造函數
- 在繼承
Object
類的時候有行為差異,無法通過super方法向父類Object傳參