JavaScript学习笔记 —— 继承

原型链继承

原型链

  1. 概念
    每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针,让这个原型对象(子的原型)等于要继承的引用类型(父)的实例,由于引用类型(父)的实例包含一个指向(父)原型对象的内部指针,以此类推,层层递进,便构成实例与原型的链条,即原型链。

(构造函数:链接: https://blog.csdn.net/weixin_41796631/article/details/82939585.)

  1. 特定
    1.实例可继承的属性
  2. 优缺点
    优点:子类的实例也是父类的实例,即让新实例的原型等于父类的实例。
    缺点:
    1、新实例无法向父类构造函数传参;
    2、继承单一;
    3、所有新实例都会共享父类实例的属性(原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原型属性也会被修改!)

构造继承

  1. 核心
    子类内部调用父类,通过.call()和.apply()将父类构造函数引入子类函数
    (在子类函数中做父类函数的自执行(复制))
  2. 特点
    1、只继承了父类构造函数的属性,没有继承父类原型的属性。
    2、解决了原型链继承缺点1、2、3。
    3、可以继承多个构造函数属性(call多个)。
    4、在子实例中可向父实例传参。
  3. 缺点
    1、只能继承父类构造函数的属性。
    2、无法实现构造函数的复用。(每次用每次都要重新调用)
    3、每个新实例都有父类构造函数的副本,臃肿。

组合继承

组合原型链继承和借用构造函数继承,常用。

  1. 核心
    结合了两种模式的优点,传参和复用
  2. 特定
    1、可以继承父类原型上的属性,可以传参,可复用。
    2、每个新实例引入的构造函数属性是私有的。
  3. 缺点
    1、调用了两次父类构造函数(耗内存)
    2、子类的构造函数会代替原型上的那个父类构造函数

原型式继承

用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。object.create()就是这个原理。
特点:类似于复制一个对象,用函数来包装。
缺点:
1、所有实例都会继承原型上的属性。
2、无法实现复用。(新实例属性都是后面添加的)

寄生式继承

重点:就是给原型式继承外面套了个壳子。
优点:没有创建自定义类型,因为只是套了个壳子返回对象(这个),这个函数顺理成章就成了创建的新对象。
缺点:没用到原型,无法复用。

寄生组合式继承

常用。
寄生:在函数内返回对象然后调用
组合:1、函数的原型等于另一个实例。2、在函数中用apply或者call引入另一个构造函数,可传参
重点:修复了组合继承的问题
继承这些知识点与其说是对象的继承,更像是函数的功能用法,如何用函数做到复用,组合,这些和使用继承的思考是一样的。上述几个继承的方法都可以手动修复他们的缺点,但就是多了这个手动修复就变成了另一种继承模式。
这些继承模式的学习重点是学它们的思想,不然你会在coding书本上的例子的时候,会觉得明明可以直接继承为什么还要搞这么麻烦。就像原型式继承它用函数复制了内部对象的一个副本,这样不仅可以继承内部对象的属性,还能把函数(对象,来源内部对象的返回)随意调用,给它们添加属性,改个参数就可以改变原型对象,而这些新增的属性也不会相互影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值