3、继承

继承的方式通常有两种:

  • 1、接口继承:接口继承通常是继承函数的签名(函数名称和参数不包括返回值定义唯一的特性),但是js是没有函数签名的,因此js中不存在函数签名
  • 2、实现继承:容易误解字面的意思,简单的理解为java中实现类的继承。

6.3.1原型链

ECMASCript实现继承的主要方式是原型链
理解如下:继承就是一个类型拥有类外一个类型的属性,根据原型、构造函数、实例之间的关系,不难想出,让一个原型对象为另外一个类型的实例,那么这个实例就会有拥有原型对象中的属性

function Person(){
    this.name="wang";
    this.age = 30;
}

function Comp(){
    this.myName = "jiuzi"
    this.Myage = 24
}
Comp.prototype = new Person();
var com = new Comp();
com.name
//"wang"
com instanceof Comp
//true
com instanceof Person
//true
com.constructor
Comp.prototype.constructor
//ƒ Person(){
  //  this.name="wang";
    //this.age = 30;
//}

如上Comp的实例有了Person的属性,因为当查看实例的属性时,若没有会顺着[[protoType]]这个内部属性向原型对象查找,由此,想要一个类型继承另外一个类型,只需把被继承的实例作为要继承的原型即可。 注:1、实例的构造函数现在指向Person 2、所有函数的默认原型都是Object函数,所有对象都是继承与Object,因此他们都会有Object对象的toString、valueOf等方法

原型链存在的问题

  • 1、在之前的内容中了解到,在创建对象时,引用类型值的属性是放在构造函数中,共享的属性才放在原型对象中,使用原型链继承时,在超类型构造函数或者超类型原型对象中存在的引用类型都会被作为当前实例的原型对象属性,这样就会出现之前说到一个实例的引用属性值的改变会影响到另外一个的问题
  • 2、创建子类型实例时,不能往超类型传递参数
  • 综上:实际使用中很少会单独使用原型

6.3.2 借用构造函数 (了解)

在子构造函数中调用超类构造函数

function Person(){
    this.name="wang";
    this.age = 30;
    this.sayName =  function(){
        alert(this.name);
    }
}
function SubPerson(){
    Person.call(this);
}
var sub = new SubPerson();
sub.constructor;
/**
ƒ SubPerson(){
    Person.call(this);
}
*/
sub instanceof Person;
//false
sub instanceof SubPerson;
//true

之前了解过 使用构造函数创建对象的4个子步骤,这一部分代码相当于执行函数内部代码的那一部分,相当于利用别人的构造函数给自己添加属性而已,感觉这种方式很一般,不太能称之为继承

6.3.3 组合继承

将原型链和借用构造函数结合起来
前提是使用原型和构造函数结合方法来创建对象

这样利用借用构造函数的方法就可以实现引用类型的属性和独有的属性的继承并可以为子类型添加额外的属性
利用原型链的方式实现函数的继承
此种方式为最常见的继承方式
代码本宝宝就不写了

6.3.4 原型式继承

不过是将原型的继承方法使用工厂的形式封装了而已,引用类型的值还是会跟着实例的改变而改变
目前有一个 Object.create(“实例”,“要为新对象添加的属性,以对象的形式写出来”);这是典型的上古时代由一个对象生产另外一个对象的写法

6.3.5 寄生式继承

6.3.5 组合寄生式继承

组合继承的缺点是会调用两次超类型构造函数
在这里插入图片描述

组合寄生式
在这里插入图片描述
第一步 创建对象是重写原型
第二步 弥补重写原型而失去的constructor属性
第三步 原型链继承的形式
组合寄生式代码如下
在这里插入图片描述

有上述代码可以看到 在inheritPrototype方法之前的部分已经完成了超类的组合式创建已经非引用方法的继承,接下来要做的就是搭建原型链,之前的方法是再次调用构造函数,然后将实例赋值给子类的原型对象,这样也就形成了之前所说的两次调用构造函数,于是,他所谓的改进方法就是直接改指针。。。
这种方法是最理想的继承继承范式

早起打卡将这部分代码实现一遍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值