美文网首页Web 前端
Javascript 继承

Javascript 继承

作者: 时光觅迹 | 来源:发表于2021-03-09 16:01 被阅读0次

在 es5 中,我们通过原型链的方式来实现继承:

var objA = function () {
  // TODO
}

objA.prototype = {
  constructor: objA,
  // TODO
}

var objB = function () {
  // TODO
}

objB.prototype = new objA()

通过以上方式我们便让objB继承了objAobjB拥有了objA的全部属性,并且可以重写其继承的属性,但objA还是原来的objA,其属性不受objB的重写影响。

现在 es6 中提出了 class (类)概念,我们可以将上面的代码改写:

class objA {
  constructor () {
    // TODO
  }
}

class objB extends objA {
    constructor () {
        super(...)
        // TODO
    }
}

此时,objB 通过 extends 关键字继承了 objA

详解:

extends 子类的继承
super(); 调用父类的构造方法,只能在子类中执行

继承可以让子类获得父类的方法、属性,可以扩充、增加新的方法、属性,也可重写继承的方法、属性等

  • 父类(基类)—— 被继承的类
  • 子类 —— 继承后的类
  1. extends(关键字) 继承 —— class 子类类名 + extends + 要继承的类名
  2. super(参数); 调用父类构造函数,只能在子类中执行;必须 在类中的构造函数constructor中使用super()必须this前;super 中的参数是传给父类的;
  3. 子类可以调用父类的方法、属性;
  4. 父类不能调用子类的方法、属性。

super 不仅可以用来访问对象的原型,还可以作为父类的构造函数来调用,所以在继承的时候,在子类的constructor中,调用super方法,可以让子类把父类的属性和方法继承过来,这样子类才会拥有父类的属性和方法(走一遍父类的属性,就是为了继承它们)。

在class的继承中,只能使用super,不能使用“Object.setPrototypeOf()”,这是es6规定好的语法,我们只能按照它的规定来写,将其当成固定的语法记住就行。

定义在类中的方法是添加到当前类对应的原型对象上,并不会影响到父类,所以其他子类也无法使用第一个子类中的方法。

一般在class类中,this指向实例化后的对象。

示例代码

/**
 * person 类
 */
class person {
  name = null;
  age = null;
  sex = null;
  phone = null;
  
  constructor (name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
  }
}

/**
 * student 类 继承 person 类
 */
class student extends person {
  classes = null;
  performance = null;

  constructor (name, age, sex, classes) {
    // 在进入函数的时候,立即调用 super() 函数
    super(name, age, sex);
    this.classes = classes;
  }

  // student 类的函数
  setYuWenPerformance (performance) {
    this.performance = performance;
  }
}

// 实例化一个 person 为 lisa
let lisa = new person('lisa', 15, 'male');
console.log(lisa)
// person {name: "lisa", age: 15, sex: "male", phone: null}

// 修改 lisa 的属性
lisa.phone = '+86-13401234567'
console.log(lisa)
// person {name: "lisa", age: 15, sex: "male", phone: "+86-13401234567"}

// 实例化一个 student 为 jay
let jay = new student('jay', 12, 'female', 'class 6-1');
console.log(jay)
// student {name: "jay", age: 12, sex: "female", phone: null, classes: "class 6-1", performance: null}

// 调用 jay (student) 的函数
jay.setYuWenPerformance(96);
console.log(jay)
// student {name: "jay", age: 12, sex: "female", phone: null, classes: "class 6-1", performance: 96}

相关文章

  • 前端面试题目(二)

    javascript对象的几种创建方式 javascript继承的6种方法 详情:[JavaScript继承方式详...

  • 函数的原型对象

    什么是原型? 原型是Javascript中的继承的继承,JavaScript的继承就是基于原型的继承。 函数的原型...

  • 005|JavaScript ES6新特性之Classes

    在过去,需要像 053|JavaScript 继承详解 那样实现继承。JavaScript这种继承实现方式与其它面...

  • Web前端经典面试试题及答案2

    javascript面向对象中继承实现? 面向对象的基本特征有:封闭、继承、多态。在JavaScript中实现继承...

  • 一文带你彻底理解 JavaScript 原型对象

    一、什么是原型 原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承。 1.1 ...

  • javascript代码积累

    一、javascript实现继承 1.基于原型链实现继承 2.基于属性和方法复制实现继承 二、javascript...

  • 理解 JavaScript 中的原型链

    JavaScript 作为一门面对对象语言,但是却不支持接口继承,只支持实现继承。JavaScript 中实现继承...

  • Javascript原型和原型链

    JavaScript在ES6之前没有类似class,extend的继承机制,JavaScript的继承主要是通过原...

  • JavaScript--对象创建和继承方法

    JavaScript创建对象方法总结精彩博文javascript继承讲解精彩博文于江水 继承讲解 JavaScri...

  • JavaScript 继承

    继承是JS中非常内容,原因就是JS没有地道的继承方式,我们只能通过各种方式来模拟面向对象中的继承。下面介绍几种常见...

网友评论

    本文标题:Javascript 继承

    本文链接:https://www.haomeiwen.com/subject/mgnfoktx.html