javascript 高级编程系列 - 继承

1. 原型链继承 (缺点:子类继承父类的引用类型的属性值会在各个实例中共享,创建子类实例时无法向父类构造函数传递参数)

// 定义父类构造函数
function SuperClass(father, mother){
    this.father = father;
    this.mother = mother;
    this.brothers = ['jack', 'mike'];
}
// 给父类中添加方法
SuperClass.prototype.getFather = function(){
    return this.father;
}

// 定义子类构造函数
function SubClass(name, age){
    this.name = name;
    this.age = age;
}
// 继承父类
SubClass.prototype = new SuperClass('perter','nancy');

// 添加新方法
SubClass.prototype.getName = function(){
    return this.name;
};
// 重写父类中的方法
SubClass.prototype.getFather = function(){
    return null;  
}

// 实例化子类
var obj = new SubClass('leon', 30);

 2. 借用构造函数继承(优点:子类继承的数据不会共享,可以在实例化子类时对父类进行传参;缺点:方法需要在构造函数中定义,以及重写)

// 定义父类构造函数
function SuperClass(father, mother){
    this.father = father;
    this.mother = mother;
    this.brothers = ['jack', 'mike'];
    this.getFather = function(){  // 需要子类继承的方法一定得在构造函数中定义
        return this.father;
    }
}

// 定义子类构造函数, 并调用父构造函数实现继承
function SubClass(name, age,father, mother){
    SuperClass.call(this, father, mother); 
    this.name = name;
    this.age = age;
    this.getFather = function(){  // 只能在构造函数中重写父类中的方法  
        return null;
    }
}
// 添加新方法
SubClass.prototype.getName = function(){
    return this.name;
};

// 实例化子类
var obj = new SubClass('leon', 30, 'peter', 'nancy');

 3. 组合继承 (融合原型链继承与借用构造函数继承)

// 定义父类构造函数
function SuperClass(father, mother){
    this.father = father;
    this.mother = mother;
    this.brothers = ['jack', 'mike'];
}
// 添加父类方法
SuperClass.prototype.getFather = function(){ 
    return this.father;
};

// 定义子类构造函数, 并调用父构造函数实现属性继承
function SubClass(name, age,father, mother){
    SuperClass.call(this, father, mother); 
    this.name = name;
    this.age = age;
}

// 通过实例化父类作为子类原型对象,实现方法继承
SubClass.prototype = new SuperClass();
SubClass.prototype.constructor = SubClass;

// 添加新方法
SubClass.prototype.getName = function(){
    return this.name;
};
// 重写父类中的方法 SubClass.prototype.getFather = function(){ return null; }; // 实例化子类 var obj = new SubClass('leon', 30, 'peter', 'nancy');

4. 原型式继承 (基于一个给定的对象,创建一个相似的对象, 相当于es5中的Object.create() 方法)

// 实现继承的函数
function object(o){
    function F(){}
    F.prototype = o;
    return new F();
}

// 定义基础对象
var baseObj = {
    name: 'john',
    age: 20,
    getName: function(){
       return this.name;
    }
}

// 创建新对象
var newObj = object( baseObj);
newObj.name = 'leon';
newObj.getName();

5. 寄生式继承 (封装原型式继承,并为新创建对象添加新的属性和方法,缺点:新添加的方法无法共享)

// 实现继承的函数
function object(o){
    function F(){}
    F.prototype = o;
    return new F();
}

// 封装继承过程的函数
function createObj(obj){
    var newObj = object(obj);
    newObj.getAge = function(){
         return this.age;
    }
    return newObj;
}

// 定义基础对象
var baseObj = {
    name: 'john',
    age: 20,
    getName: function(){
       return this.name;
    }
}

// 创建新对象
var obj = createObj( baseObj);
obj.name = 'leon';
obj.getName();
obj.getAge();

6. 寄生组合式继承 (改进组合式继承,将原型方法的继承改为利用寄生式继承的方法进行继承,避免了在prototype上产生不必想的属性值,以及多次调用父类构造函数的情况)

// 定义父类构造函数
function SuperClass(father, mother){
    this.father = father;
    this.mother = mother;
    this.brothers = ['jack', 'mike'];
}
// 添加父类方法
SuperClass.prototype.getFather = function(){ 
    return this.father;
};

// 定义子类构造函数, 并调用父构造函数实现属性继承
function SubClass(name, age,father, mother){
    SuperClass.call(this, father, mother); 
    this.name = name;
    this.age = age;
}

// 继承原型的函数
function inheritPrototype(SubClass, SuperClass){
    var prototype = object(SuperClass.prototype);
    prototype.constructor = SubClass;
    SubClass.prototype = prototype;
}

// 通过调用原型继承函数,实现方法继承
inheritPrototype(SubClass, SuperClass);

// 添加新方法
SubClass.prototype.getName = function(){
    return this.name;
};

// 重写父类中的方法
SubClass.prototype.getFather = function(){  
    return null;
};

// 实例化子类 
var obj = new SubClass('leon', 30, 'peter', 'nancy');

 

posted @ 2017-04-01 01:25  箫笛  阅读(236)  评论(0编辑  收藏  举报