面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。

大部分面向对象的编程语言,都是通过“类”(class)实现对象的继承。传统上,JavaScript 语言的继承不通过 class(ES6 引入了class 语法),而是通过“原型对象”(prototype)实现。那么在JS中常见的继承方式有几种呢?

方式一、原型链继承

//父类型
function Animal(name) {this.name = name;this.eat = function (food) {console.log(this.name + "正在吃:"+ food);}
}function Dog() {}
Dog.prototype = new Animal();
Dog.prototype.name = "大皇狗";var dog = new Dog();console.log(dog.name);
dog.eat('打骨头');console.log(dog instanceof Animal); //true
console.log(dog instanceof Dog); //true

特点:

  1. 非常纯粹的继承关系,实例是子类的实例,也是父类的实例
  2. 父类新增原型方法/原型属性,子类都能访问到
  3. 简单,易于实现

缺点:

  1. 要想为子类新增属性和方法,必须要在new Animal()这样的语句之后执行,不能放到构造器中
  2. 无法实现多继承
  3. 来自原型对象的所有属性被所有实例共享
  4. 创建子类实例时,无法向父类构造函数传参

方式二: 借用构造函数继承

function Dog() {Animal.call(this);this.name = name || '大黄狗';
}var dog = new Dog();
console.log(dog.name);
dog.eat("大骨头");
console.log(dog instanceof Animal); // false
console.log(dog instanceof Dog); // true

特点:

  1. 解决了1中,子类实例共享父类引用属性的问题
  2. 创建子类实例时,可以向父类传递参数
  3. 可以实现多继承(call多个父类对象)

缺点:

  1. 实例并不是父类的实例,只是子类的实例
  2. 只能继承父类的实例属性和方法,不能继承原型属性/方法
  3. 无法实现函数复用,每个子类都有父类实例函数的副本,影响性能

方式三:ES6中class 的继承

class Person {//调用类的构造方法constructor(name, age) {this.name = namethis.age = age}//定义一般的方法showName() {console.log("调用父类的方法")console.log(this.name, this.age);}
}
let p1 = new  Person('kobe', 39)
console.log(p1)
//定义一个子类
class Student extends Person {constructor(name, age, salary) {super(name, age)//通过super调用父类的构造方法this.salary = salary}showName() {//在子类自身定义方法console.log("调用子类的方法")console.log(this.name, this.age, this.salary);}
}
let s1 = new Student('wade', 38, 1000000000)
console.log(s1)
s1.showName()

JavaScript常见的六种继承方式相关推荐

  1. JavaScript 常见的六种继承方式

    方式一.原型链继承 这种方式关键在于:子类型的原型为父类型的一个实例对象. -------------------------------------------------------------- ...

  2. JavaScript六种继承方式的递进推演

    1. 原型链继承 function Parent1() {this.name = "Parent1"this.son = [1] } // 需要继承的子类 function Chi ...

  3. javascript 的七种继承方式(三)组合继承

    组合继承 前面两篇我们了解到:原型链继承存在着引用类型问题,而借用构造函数又无法实现函数复用和原型方法继承的问题.那么能不能把两者结合一下,取其精华,弃其糟粕?答案是肯定的.那就是接下来我们要介绍的组 ...

  4. JavaScript中6种继承方式总结

  5. 前端进击的巨人(七):走进面向对象,原型与原型链,继承方式

    "面向对象" 是以 "对象" 为中心的编程思想,它的思维方式是构造. "面向对象" 编程的三大特点:"封装.继承.多态" ...

  6. JavaScript中6种常见的继承方式

    为什么需要继承? 在实际编码的过程中,如果有很多类似的方法都存放于构造函数中,这样会导致内存的浪费(内存泄漏),在这种情况下我们就需要用到继承. 继承是什么? 所谓继承就是通过某种方式让一个对象可以访 ...

  7. Js理解之路:Js常见的6中继承方式

    目录 一.JS 实现继承的几种方式 第一种:原型链继承 二.构造函数继承(借助call方法) 三.组合继承(原型链继承+构造函数继承) 第四种:原型式继承(借助Object.create) 第五种:寄 ...

  8. 探究JS常见的6种继承方式

    先看以下百科对(面向对象的继承)的解释! 通过以上精炼实用的解释,我们可以了解到继承的基本作用和功能!即可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法等. 广告:帮忙点击>> ...

  9. js常见的的6种继承方式

    继承是面向对象的,继承可以帮助我们更好的复用以前的代码,缩短开发周期,提高开发效率:继承也常用在前端工程技术库的底层搭建上,在整个js的学习中尤为重要 常见的继承方式有以下的六种 一.原型链继承 原型 ...

  10. jQuery-源码阅读,JavaScript原生继承方式与jQuery中的继承

    JavaScript中继承方法有以下几种: 1.原型链继承: function Book (name,author){this.name=name;this.author=author;}Book.p ...

最新文章

  1. windows7、windows 2008和windows 2008 R2 的系统封装介绍
  2. CF1142C U2
  3. 排序算法——(1)简介
  4. 以下描述中不属于python语言控制结构的是_高中信息技术《Python语言》模块试卷...
  5. sharepoint ECMA
  6. 深度学习基础1(神经网络)
  7. c mysql linux,linux上C语言连接mysql
  8. Swiper – 经典的移动触摸滑块插件【免费】
  9. 字符串(的基本操作,格式化,方法)
  10. PHP实现留言板功能
  11. tan和cot的梗_sin对cos说,今晚我们是tan呢?还是cot呢?是什么意思?
  12. unity打包报错,又是血压升高的一天
  13. python调用java之Jpype实现java接口
  14. Vue 路由懒加载和动态加载
  15. SPSS(二)SPSS实现多因素方差分析模型(图文教程+数据集)
  16. 基于数据思维的科学减肥_能量与营养
  17. IE8允许ActiveX控件设置
  18. G1:为什么老生代分区到新生代分区和老生代到老生代需要记录引用关系
  19. Package fontspec Error: The font “***“ cannot be found.解决方案
  20. 如何监控文件已成功通过EDI系统发给客户(一)-邮件通知

热门文章

  1. 看漫画来告诉你:什么是 “元宇宙” ?
  2. 诺基亚 8208支持java么_诺基亚8_诺基亚8208怎么上网_8208 诺基亚
  3. MOSFET手册解读MOS管参数解读(转)
  4. python list 添加噪声_在python中为信号添加噪声
  5. 【echart】常用术语
  6. Xutils使用详解(二)
  7. python迭代法求极值_4计算函数零点和极值点的迭代法
  8. 耳挂式蓝牙耳机原理_一种耳挂式蓝牙耳机的制作方法
  9. java工作流引擎Jflow父子流程demo
  10. 【叁】量化思维--复利