instance檢測函數的propertype是否在對象的原型鏈上出現過函數
一、借用構造函數this
function People(name){ this.name = name } function Student(name){ People.call(this,name) }
缺點:一、instance失效(超類的原型對子類不可見);二、大量重複spa
二、組合繼承prototype
function People(name){
this.name = name } function Student(name){ People.call(this,name) } Student.prototype=new People('zale')//重寫原型,繼承父類實例屬性與方法 Student.prototype.constructor=Student//因爲原型被重寫,因此須要從新定義一下constructor,定義類型
缺點:實例屬性被賦值了2次code
三、原型繼承對象
Object.create(obj)以obj爲原型建立對象blog
缺點:一、注意屬性共享;二、沒有子類的存在繼承
四、寄生式繼承原型鏈
let People = { name:'zale' } function Student(_prop_){ let st = Object.create(_prop_) st.say = function(){ return 'hello' } return st } let s1 = Student(People)
缺點:同上原型
五、寄生組合式繼承(完美)
function People(name){ this.name = name } function Student(name){ People.call(this,name) } Student.prototype=Object.create(People.prototype)//與組合繼承的區別:從新定義原型爲父類原型,實例方法這裏不會調用 Student.prototype.constructor=Student//因爲原型被重寫,因此須要從新定義一下constructor