1. 程式人生 > >關於常見繼承的幾種方法

關於常見繼承的幾種方法

初始化 logs 正在 不能 構造 函數 都是 cti eth

一:關於繼承
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)



關於常見繼承的幾種方法