千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:太原千锋IT培训  >  技术干货  >  javascript中的常见继承

javascript中的常见继承

来源:千锋教育
发布人:qyf
时间: 2023-01-30 16:14:55

  我们在学习前端的过程中一定会遇到继承这个问题

  继承其实就是构造函数和构造函数之间的一种关系

  当一个构造函数A的实例使用构造函数B身上的属性和方法,这个时候我们就说构造函数A继承至构造函数B。

  我们一般把构造函数A称之为子类,构造函数B称之为父类

  想要弄明白继承就要先弄明白原型链

  原型链:

图片 1

  function Person() {

  // 属性

  this.name = 'Jack'

  this.age = 18

  this.gender = '男'

  }

  // 实例

  const p = new Person()

  // 1.p 的 __proto__ 指向了谁?

  console.log(p.__proto__ === Person.prototype)

  // 2.Person 的 __proto__ 指向了谁 ?

  console.log(Person.__proto__ === Function.prototype)

  // 3.Person.prototpye 的 __proto__ 指向了谁 ?

  console.log(Person.prototype.__proto__ === Object.prototype)

  // 4.Function.prototype 的 __proto__ 指向了谁 ?

  console.log(Function.prototype.__proto__ === Object.prototype)

  // 5.Function 的 __proto__ 指向了谁 ?

  console.log(Object.prototype.__proto__)

  // 6.Object.prototype 的 __proto__ 指向了谁 ?

  console.log(Function.__proto__ === Function.prototype)

  // 7.Object 的 __proto__ 指向了谁 ?

  console.log(Object.__proto__ === Function.prototype)

  常用的继承方法

  · 我们在面试或者开发过程中使用做多的继承有

  o 原型继承

  o 原型链继承

  o 组合继承

  · 当然还有一些别的继承,其它的继承相对于上面的三种情况使用的就少了很多

  · 主要介绍上面的三种继承

  原型继承

  原理

  · 原型继承的核心原理:子类的原型指向父类的实例

  · 这个也可以理解成把父类的实例赋值给子类的原型对象

  优点

  · 父类构造函数体内的属性和原型上的方法都可以实现继承

  缺点

  · 继承下来的属性不在自己身上, 在自己的原型上

  · 一个构造函数的实例, 需要在两个地方传递参数

  · 所有子类的实例, name 和 age 一模一样

  // 父类

  function Person(name, age) {

  //属性

  this.name = name

  this.age = age

  }

  // 方法

  Person.prototype.paly = function () { console.log('玩游戏'); }

  // 子类

  function Students(classRoom) {

  // 属性

  this.classRoom = classRoom

  }

  // 把子类的原型指向父类的实例对象

  // 把父类的实例赋值给子类的原型(原型对象)

  // 创建一个父类的实例

  const p = new Person('Jack', 25)

  // 子类的实例指向父类的原型对象

  Students.prototype = p

  // 实例化一个对象

  let s = new Students('高级1班')

  console.log(s);

  let s1 = new Students('高级2班')

  console.log(s1);

  执行结果:

图片 2

  借用构造函数继承

  原理

  · 把我们的父类够构造函数当做普通函数在子类构造函数体内调用

  · 利用 call 方法改变函数内的 this 指向

  优点

  · 子类的所有继承下来的属性都在自己身上

  · 子类的所有参数在一个地方传递

  · 子类的所有实例都可以给继承下来的属性赋不一样的值

  缺点

  · 父类的原型上的方法没有继承下来

  // 父类

  function Person(name, age) {

  // 属性

  this.name = name

  this.age = age

  }

  // 原型对象上添加一个方法

  Person.prototype.paly = function () { console.log('玩游戏'); }

  // 子类

  function Students(name, age,classRoom) {

  this.classRoom = classRoom

  // 因为这个this指向的就是子类的实例

  Person.call(this, name, age)

  }

  // 实例化一个对象

  let s = new Students('张三',25,'高级1班')

  console.log(s);

  let s1 = new Students('李四',20,'高级2班')

  console.log(s1);

  执行结果:

图片 3

  组合继承

  原理

  · 把 原型继承 和 借用构造函数 继承放在一起使用

  优点

  · 把原型继承 和 借用构造函数继承放在一起使用

  · 既达到了全都继承下来又能把属性继承在自己身上

  缺点

  · 子类的原型上有一套多余的属性

  // 父类

  function Person(name, age) {

  // 属性

  this.name = name

  this.age = age

  }

  // 原型对象上添加一个方法

  Person.prototype.paly = function () { console.log('玩游戏'); }

  // 子类

  function Students(name, age,classRoom) {

  this.classRoom = classRoom

  // 借用构造函数继承

  Person.call(this, name, age)

  }

  // 原型继承

  // 主要的目的就是为了使用父类身上的方法

  Students.prototype = new Person()

  // 实例化一个对象

  let s = new Students('张三',25,'高级1班')

  console.log(s);

  let s1 = new Students('王五',24,'高级2班')

  console.log(s1);

  s1.play()

  执行结果:

图片 4

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

React的遮羞布

2023-01-31

Local Storage的高阶用法

2023-01-31

javascript中如何将伪数组转换成真数组

2023-01-30

最新文章NEW

变量的预解析

2023-01-31

Vue中常见的组件间通信方案及典型应用场景

2023-01-31

VueJS中的动画菜单效果的实现

2023-01-31

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>