關於常見繼承的幾種方法
一:關於繼承
1、原型鏈繼承:
原理:是將父類的實例,轉換子類的原型
優點:繼承關系非常清晰
易於實現
缺點:來自原型對象引用的屬性都是所有實例共享的
創建子類的實例時,無法向父類構造函數傳參
2、構造函數繼承:
原理:將父類的構造函數來增強子類的實例,說白了就是將父類的實例屬
性復制給子類
優點:解決了子類實例中共享父類引用的問題
解決了創建子類實例時可以向父類傳參,可以實現多繼承(call多
個父類對象)
缺點:實例並不是父類的實例,而是子類的實例
最大的弊端:只能繼承父類的實例屬性和方法,不能繼承原型屬性和方法
3、實例繼承:
原理:為父類的實例添加新特性,作為子類的實例返回
優點:不限制調用方式,主要使用實例繼承,不管是new子類 還是直接調
用子類()返回的對象都具有同樣的效果
缺點:實例時父類的實例不是子類的實例,不支持多繼承
4、拷貝繼承
原理:拷貝
優點:支持多繼承
缺點:效率較低,占用內存高(因為要拷貝父類的屬性給子類)
5、組合繼承
原理:通過調用父類的構造函數 繼承父類的屬性 並保留傳參的優點 通
過父類的實例來做子類的原型,實現函數原型上的繼承
優點:彌補了構造函數繼承的缺陷 可以繼承父類原型上的屬性
既可以是子類的實例 也可以是父類的實例
不存在引用共享的問題
可傳參
缺點:調用了兩次父類構造函數 生成了兩份實例
6、寄生組合繼承
原理:通過寄生的方式 在組合繼承的基礎上 避免初始化兩次
優點:堪稱完美
缺點:實現較為復雜
1、原型繼承例題:
function Animal(name){ this.name = name||"yangyang", this.dosomething = function(){ console.log(this.name+"正在吃shit" } } Animal.prototype.eat = function(food){ console.log(this.name+"正在學習"+food }
2、構造函數繼承
function Person(){ } Person.prototype = new Animal() Person.prototype.name = "haha" var taotao = new Person(); console.log(taotao.name) taotao.eat("apple") taotao.dosomething() function Person(){ Animal.call(this,"wangjie") } var taotao = new Person() console.log(taotao.name) taotao.dosomething() console.log(taotao.eat("yu")) console.log(taotao instanceof Animal)//false console.log(taotao instanceof Person)//true
3、實例繼承
function Person(){ var instance = new Animal instance.name = "rubin" return instance } var taotao = Person() console.log(taotao.name) taotao.dosomething() taotao.eat("yu") console.log(taotao instanceof Animal) console.log(taotao instanceof Person)
4、拷貝繼承
function Person(){ var instance = new Animal() for(var p in instance){ Person.prototype[p] = instance[p] } Person.prototype.name = "wangjing" } var taotao = new Person() console.log(taotao.name) taotao.dosomething() console.log(taotao instanceof Animal) console.log(taotao instanceof Person)
5、組合繼承
function Person(name){ Animal.call(this,name) this.name = name || "hongxia" } Person.prototype = new Animal() var taotao = new Person() console.log(taotao.name) taotao.dosomething() console.log(taotao instanceof Animal) console.log(taotao instanceof Person)
6、寄生組合繼承
function Person(){ Animal.call(this) this.name = "sunfei" } (function(){ var Super = function(){} Super.prototype = Animal.prototype; Person.prototype = new Super() })(); var taotao = new Person() console.log(taotao.name) taotao.dosomething() console.log(taotao instanceof Animal) console.log(taotao instanceof Person)
關於常見繼承的幾種方法