关于继承

1.类式继承:

//声明父类
function SuperClass(){
    this.superValue = true;
}
//为父类添加共有方法
SuperClass.prototype.getSuperValue = function(){
    return this.superValue;
}
//声明子类
function SubClass(){
    this.subValue = false;
}
//继承父类
SubClass.prototype = new SuperClass();
//为子类添加共有方法
SubClass.prototype.getSubValue = function(){
    return this.subValue;
}

优点:所有子类实例可共用父类的属性与方法

缺点:子类实例容易误修改公用属性(从父类继承),且子类实现继承靠其原型prototype对父类进行实例化,故无法向父类传递参数,也无法在父类实例化时,对父类内部属性进行初始化

应用场景:父类无属性,或者父类属性是用于存储结果的(对象,数组等)

2.构造函数继承

//声明父类
function SuperClass(id) {
    this.common = {aa:"aa"};
    this.id = id;
}
//为父类添加共有方法
SuperClass.prototype.getSuperValue = function () {
    console.log(this.common);
}
//声明子类
function SubClass(id) {
    /**
     *  这里写子类特有属性(多个子类)
     */
    // 继承父类
    SuperClass.call(this,id);
}

优点:子类实例化父类中的属性

缺点:没有公用属性和公用方法

应用场景:父类只是提供给子类进行初始化子类共有的属性,其属性值可以由子类传递也可以由父类定义;

3.组合继承

//声明父类
function SuperClass(id) {
    this.common = {aa:"aa"};
    this.id = id;
}
//为父类添加共有方法
SuperClass.prototype.getSuperValue = function () {
    console.log(this.common);
}
//声明子类
function SubClass(id) {
    /**
     *  这里写子类特有属性(多个子类)
     */
    // 继承父类
    SuperClass.call(this,id);
}
// 类式继承 子类原型继承父类
SubClass.prototype = new SuperClass();
// 子类原型方法
SubClass.prototype.getId = function(){
    console.log(this.id);
}

优点:既有类式继承的优点,也有构造函数继承的优点

缺点:与类似继承一样(比如函数覆盖,无法恢复),造成资源浪费(构造函数执行了两次)

应用场景:不建议使用;

4.原型式继承

function inheritObject(o){
    // 声明一个过度函数对象
    function F(){};
    //过度对象的原型继承父对象
    F.prototype = o;
    //返回过度对象的一个实例
    return new F();
}

优点:给多个子类继承时,不必每次实例化父类,通过过度实例继承,也不会意外改变继承来的父类属性,减少开销(目前衍生objcet.create方法)

5.寄生式继承

//声明基对象
var book = {
    name: "js",
}
function createBook(obj) {
    // 通过运行继承方式创建对象
    var o = inheritObject(obj);
    // 拓展新对象
    o.getName = function () {
        console.log(this.name)
    }
    //返回拓展后的新对象
    return o;
}

优点:对原型对象进行拓展,但不更改继承的父类

应用场景:无

6.寄生组合式继承

/**
 * 寄生式继承 继承原型
 * 传递参数 subClass 子类
 * 传递参数 superClass 父类
 */
function inheritPrototype(subClass,superClass){
    // 复制一份父类的原型副本保存在变量中
    var p = inheritObject(superClass.prototype);
    // 修正因为重写子类原型导致子类的constructor属性被修改
    p.constructor = subClass;
    // 设置子类原型
    subClass.prototype = p;
}

优点:集合构造函数继承和寄生式继承的优点,且修复了子类原型的constructor的指向

缺点:给子类原型添加方法必须通过点语法一一添加

应用场景:父类既有子类需要初始化的属性,又有子类需要公用的属性

7.多继承

使用Object.assign()方法对继承的对象进行拓展(SE6),也可写函数实现同样效果

8.多态

通过检测传入参数类型或长度等,进行不同方法的调用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值