成都前端培训课程:JavaScript中对象的4种不同继承方式

[复制链接]

211

主题

211

帖子

346

积分

中级会员

Rank: 3Rank: 3

积分
346
分享到:
发表于 2019-3-6 14:48:05 | 显示全部楼层 |阅读模式
  在学习前端开发的javascript部分的时候,很多人在面向对象的部分就很难走下去了,主要的原因还是逻辑更加复杂了,需要理解的内容比直观的开发布局难一点。

  在面向对象编程里,封装和继承是比较重要的,这中间,继承是相对而言比较难理解的,因为javascript的继承方式比较多,也有不同的优缺点。

  那么今天就来带大家一起来聊聊javascript继承的常用4种方法。

  1、原型链继承

  核心: 将父类的实例作为子类的原型

  缺点: 父类新增原型方法/原型属性,子类都能访问到,父类一变其它的都变了

  2、构造继承

  基本思想

  借用构造函数的基本思想就是利用call或者apply把父类中通过this指定的属性和方法复制(借用)到子类创建的实例中。

  因为this对象是在运行时基于函数的执行环境绑定的。也就是说,在全局中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。

  call、apply 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

  所以,这个借用构造函数就是,new对象的时候(new创建的时候,this指向创建的这个实例),创建了一个新的实例对象,并且执行Parent里面的代码,而Parent里面用call调用了Person,也就是说把this指向改成了指向新的实例,所以就会把Person里面的this相关属性和方法赋值到新的实例上,而不是赋值到Person上面,所以所有实例中就拥有了父类定义的这些this的属性和方法。

  因为属性是绑定到this上面的,所以调用的时候才赋到相应的实例中,各个实例的值就不会互相影响了。

  核心:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)

  缺点: 方法都在构造函数中定义, 只能继承父类的实例属性和方法,不能继承原型属性/方法,无法实现函数复用,每个子类都有父类实例函数的副本,影响性能

  3、组合继承

  组合继承(所有的实例都能拥有自己的属性,并且可以使用相同的方法,组合继承避免了原型链和借用构造函数的缺陷,结合了两个的优点,是最常用的继承方式)

  核心:通过调用父类构造,继承父类的属性并保留传参的优点,然后再通过将父类实例作为子类原型,实现函数复用

  缺点:调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)

  4、寄生组合继承

  核心:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点

  缺点:堪称完美,但实现较为复杂

  版权声明:文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与达内成都web前端培训机构网站联系删除或授权事宜。

使用高级回帖 (可批量传图、插入视频等)快速回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则   Ctrl + Enter 快速发布  

发帖时请遵守我国法律,网站会将有关你发帖内容、时间以及发帖IP地址等记录保留,只要接到合法请求,即会将信息提供给有关政府机构。
快速回复 返回顶部 返回列表