文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JS有哪些方式可以实现继承?

2024-12-03 04:37

关注

1、原型链继承

  1. function UserBase(){ 
  2. function User(){ 
  3. User.prototype = new UserBase(); 

将父类的实例作为子类的原型。

2、构造继承

实际上使用父类的构造函数来增强子类,等于是把父类的构造函数复制给子类。

  1. function UserBase(){ 
  2. function User(userName) { 
  3.     UserBase.call(this); 
  4.     this.userName = userName; 
  5. let user = new User("鬼鬼"
  6. user.userName; 

优点:

(1)可以向构造函数传参数

(2)可以实现多继承,多call几个

缺点:

(1)无法实现函数复用

(2)只能继承父类的属性和方法,不能继承父类的原型

3、实例继承

为父类实例添加新属性,作为子类实例返回。

  1. function UserBase(){ 
  2. function User(userName) { 
  3.   let userBase = new UserBase(); 
  4.   userBase.userName = userName; 
  5.   return userBase; 
  6. let user = new User("鬼鬼"
  7. user.userName; 

缺点:无法实现多继承

4、拷贝继承

  1. function UserBase(userName){ 
  2. UserBase.prototype.showInfo = function(){ 
  3.  console.log(this.userName) 
  4. function User(userName) { 
  5.  let userBase = new UserBase(); 
  6.  for (let attr in userBase) { 
  7.    User.prototype[attr] = userBase[attr]; 
  8.  } 
  9.  this.userName = userName; 
  10.  
  11. let user = new User("鬼鬼"
  12. user.showInfo(); 

不可枚举方法拷贝不了

5、组合继承

通过调用父类构造函数,继承了父类的属性,并保留了传参的优点。

然后再将父类实例作为子类原型,实现了函数复用。

  1. function UserBase(userName){ 
  2.  this.userName = userName 
  3. UserBase.prototype.showInfo = function(){ 
  4.  console.log(this.userName) 
  5. function User (userName){ 
  6.     //call方式  
  7.  UserBase.call(this,userName) 
  8.      //apply方式  
  9.     UserBase.apply(this,[userName]) 
  10. User.prototype = new UserBase() 
  11. let user = new User("鬼鬼"
  12. user.showInfo();  

优点:

缺点:

调用了两次父类构造函数

6、寄生组合继承

通过寄生的方式,去掉了父类的实例属性,在调用父类构造函数时,

就不会初始化两次实例方法,避免了组合继承的缺点

  1. function UserBase(userName){ 
  2.  this.userName = userName 
  3. UserBase.prototype.showInfo = function(){ 
  4.  console.log(this.userName) 
  5. function User (userName){ 
  6.  UserBase.call(this,userName) 
  7. User.prototype = Object.create(UserBase.prototype) 
  8. User.prototype.constructor = User 
  9. let user = new User("鬼鬼"
  10. user.showInfo();  

7、Class继承

  1. class UserBase{ 
  2.  constructor(userName){ 
  3.   this.userName = userName 
  4.  } 
  5.  showInfo(){ 
  6.   console.log(this.userName) 
  7.  } 
  8. class User extends UserBase{ 
  9.  constructor(value){ 
  10.   super(value)  
  11.  } 
  12. var user = new User("鬼鬼"
  13. user.showInfo(); 

参考资料

https://blog.csdn.net/guoqing2016/article/details/106418081/

http://www.bubuko.com/infodetail-2556919.html

本文转载自微信公众号「前端人」,可以通过以下二维码关注。转载本文请联系前端人公众号。

 

来源:前端人内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯