我的编程空间,编程开发者的网络收藏夹
学习永远不晚

es6实现继承的关键字是什么

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

es6实现继承的关键字是什么

本篇内容主要讲解“es6实现继承的关键字是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6实现继承的关键字是什么”吧!

es6中用class和extends关键字来实现继承。ES6中引入了class关键字来声明类, 而class(类)可通过extends关键字实现继承,让子类继承父类的属性和方法,语法“class 父类名{...} class 子类名 extends 父类名{...};”。

ES6 Class 的继承

1.简介

Class可以通过extends关键字实现继承,让子类继承父类的属性和方法。这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。

//父类class Point { ...}//子类class ColorPoint extends Point {constructor(x, y, color) {super(x, y);this.color = color;}toString() {return this.color + '' + super.toString(); // 调用父类的toString方法}}

上面代码中,constructor方法和toString方法内部,都出现了super关键字,super在这里表示父类的构造函数,用来新建一个父类的实例对象。

ES6规定,子类必须在constructor方法中调用super(),否则会报错,这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后在添加子类自己的实例属性和方法。

为什么子类的构造函数,一定要调用super()?

这是因为在ES5的继承机制中,是先创造一个独立的子类的实例对象,然后再将父类的方法添加到这个对象上,即“实例在前,继承在后”;ES6的继承机制,则是先将父类的属性和方法,加到一个空的对象上面,然后再将该对象作为子类的实例,即“继承在前,实例在后”。

这意味着,每次新建子类实例时,父类的构造函数必定会先运行一次

class Foo {constructor() {console.log(1);}}class Bar extends Foo {constructor() {super();console.log(2);}}const bar = new Bar(); // 1 2

上面的代码中,子类Bar新建实例时,会输出1和2,这就是因子类构造函数调用super()时,会执行一次父类构造函数。只有在子类的构造函数中调用super之后,才可以使用this关键字,否则会报错。这是因为子类实例的构建,必须先完成父类的继承,只有super方法才能让子类实例继承父类。

class Point {constructor(x, y) {this.x = x;this.y = y;}}class ColorPoint extends Point {constructor(x, y, color) {this.color = color;super(x, y);this.color = color;}}"

如果子类没有定义constructor方法,这个方法会默认添加,并且里面会调用super,也就是说,不管有没有显示定义,任何一个子类都有constructor方法.

class Point {  constructor(x, y) {    this.x = x;    this.y = y;  }}class ColorPoint extends Point {}let cp = new ColorPoint(25, 8);console.log(cp); //{x: 25, y: 8}class ColorPoint extends Point {  constructor(...args) {    super(...args);  }}let cp = new ColorPoint(25, 8);console.log(cp); //{x: 25, y: 8}

2.私有属性和私有方法的继承

父类所有的属性和方法,都会被子类继承,除了私有的属性和方法。子类无法继承父类的私有属性,或者说私有属性只能在定义它的class里面使用。

class Foo {  #p = 1;  #m() {    console.log('hello');  }}class Bar extends Foo {  constructor() {    super();    console.log(this.#p); // 报错    this.#m(); // 报错  }}

上面示例中,子类 Bar 调用父类 Foo 的私有属性或私有方法,都会报错。

如果父类定义了私有属性的读写方法,子类就可以通过这些方法,读写私有属性。

class Foo {  #p = 1;  getP() {    return this.#p;  }}class Bar extends Foo {  constructor() {    super();    console.log(this.getP()); // 1  }}

3.静态属性和方法的继承

父类的静态属性和静态方法,也会被子类继承。

class A {  static hello() {    console.log('hello world');  }}class B extends A {}B.hello()  // hello world

上面代码中,hello()A类的静态方法,B继承A,也继承了A的静态方法。

注意,静态属性是通过浅拷贝实现继承的,如果继承的属性是原始数据类型,子类中操作继承的静态属性不会影响到父类,但如果继承的属性是一个对象,那么子类修改这个属性会印象到父类

class C {static foo = 100;}class D extends C {constructor() {super();D.foo--;}}const d = new D();C.foo; // 100D.foo;  // 99class A {static foo = { n: 100 };}class B extends A {constructor() {super();B.foo.n--;}}const b = new B();B.foo.n // 99A.foo.n  // 99

4.Object.getPrototypeOf()

Object.getPrototypeOf()方法可以用来从子类上获取父类。

class Point {  }class ColorPoint extends Point {  }Object.getPrototypeOf(ColorPoint) === Point// true

因此,可以使用这个方法判断,一个类是否继承了另一个类。

5.super关键字

super关键字既可以当做函数使用,也可以当做对象使用

第一种情况,super作为函数调用时,代表父类的构造函数。调用super的作用是形成子类的this对象,把父类的实例属性和方法都放到这个this对象上面。

class A {constructor() {    console.log(new.target.name);  }}class B extends A {constructor() {super();}}new A(); // Anew B(); // B

第二种情况,super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。

class A {p() {    return 2;  }}class B extends A {  constructor() {    super();    console.log(super.p()); // 2  }}let b = new B();

上面代码中,子类B中的super.p(),将super当做一个对象使用,这时super在普通对象中,指向的是A.prototype,super.p()相当于A.prototype.p()。

由于super指向父类的原型对象,所以定义在父类实例上的方法或属性,是无法通过super调用的。如下所示:

class A {constructor() {this.p = 2;}}class B extends A {get m() {return spuer.p;}}let b = new B();b.m // undefined

为了解决这种问题,可以将属性定义在父类的原型对象上

class A {};A.prototype.x = 2;class B extends A {constructor() {super();console.log(super.x);}}let b = new B();

ES6规定,在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例

class A {constructor() {this.x = 1;}print() {console.log(this.x);}}class B extends A {constructor() {super();this.x = 2;}m() {super.print();}}let b = new B();b.m(); // 2

上面代码中,super.print()调用的是A.prototype.print(),但是此时方法内部的this指向是子类B的实例,所以输出2。

由于this指向的是子类实例,所有如果通过super对某个属性赋值,这时super就是this,赋值的属性会变成子类实例的属性

class A {constructor() {this.x = 1;}}class B extends A {constructor() {super();this.x = 2;super.x = 3;console.log(super.x); //undefindconsole.log(this.x); // 3}}

上面代码中,super.x赋值为3,这时等同于对this.x赋值为3。而当读取super.x 的时候,读的是A.prototype.x,所以返回undefined

如果super作为对象,用在静态方法之中,这时super将指向父类,而不是父类的原型对象。

class Parent {static myMethod(msg) {console.log('static', msg);}myMethod(msg) {console.log('instance', msg);}}class Children extends Parent {static myMethod(msg) {super.myMthod(msg);}myMethod(msg) {    super.myMethod(msg);  }}Child.myMethod(1); // static 1var child = new Child();child.myMethod(2); // instance 2

上面代码中,super在静态方法之中指向父类,在普通方法之中指向父类的原型对象。

另外,在子类的静态方法中通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类的实例

class A {constructor() {    this.x = 1;  }  static print() {    console.log(this.x);  }}class B extends A {  constructor() {    super();    this.x = 2;  }  static m() {    super.print();  }}B.x = 3;B.m() // 3

在静态方法m中,super.print指向父类的静态方法,到那时this指向的是类B,而不是B的实例。

到此,相信大家对“es6实现继承的关键字是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

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

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

es6实现继承的关键字是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

es6实现继承的关键字是什么

本篇内容主要讲解“es6实现继承的关键字是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6实现继承的关键字是什么”吧!es6中用class和extends关键字来实现继承。ES6中引入了
2023-07-05

php实现继承的关键词是什么

php实现继承的关键词是“extends”。PHP中只能使用单继承模式,即一个类只能直接从另一个类中继承数据;而类的继承需要通过“extends”关键字来实现,语法“class 子类名 extends 父类名{... ...}”。
2016-11-23

php实现继承的关键词是什么

PHP实现继承的关键词PHP使用以下关键词来实现继承:extends:子类从父类继承属性和方法。parent:访问父类的属性和方法。protected:限制属性和方法在子类中可见。private:限制属性和方法仅在当前类中可见。PHP不支持多重继承,但traits可模拟这种行为。子类从一个父类继承,继承过程遵循特定顺序,包括调用父类构造函数和覆盖父类方法。
php实现继承的关键词是什么
2024-04-25

es6中用什么实现继承

es6中用class和extends关键字来实现继承。ES6中引入了class关键字来声明类, 而class(类)可通过extends关键字实现继承,让子类继承父类的属性和方法,语法“class 父类名{...} class 子类名 extends 父类名{...};”。
2023-05-14

Java类的继承使用什么关键字

类的继承子类及其定义Java类的继承使用extends关键字 (推荐学习:java课程)class SubClass extends SuperClass{........}子类可以继承父类的属性和方法子类不能继承带private修饰符的属性,方法子类不
Java类的继承使用什么关键字
2016-10-27

es6继承的原理是什么

ES6继承的原理是通过使用`class`关键字和`extends`关键字来创建子类,并通过`super`关键字调用父类的构造函数和方法。ES6继承使用了基于原型的继承机制。当一个子类继承一个父类时,子类会创建一个新的原型对象,并将父类的原型
2023-10-09

php实现继承的关键词是哪个

本篇内容主要讲解“php实现继承的关键词是哪个”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php实现继承的关键词是哪个”吧!php实现继承的关键词是“extends”。PHP中只能使用单继承模
2023-06-25

java怎么继承,使用什么关键字?

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 (推荐学习:java课程)通过extends关键字可
java怎么继承,使用什么关键字?
2015-08-21

es6类的继承怎么实现

在ES6中,可以使用`extends`关键字来实现类的继承。继承可以实现一个类继承另一个类的属性和方法。下面是一个示例代码:```javascriptclass Animal {constructor(name) {this.name =
2023-10-09

C++继承的实现原理是什么

C++继承的实现原理是通过派生类继承基类的成员和方法。当一个派生类继承一个基类时,派生类会拥有基类的所有成员变量和成员函数。在内存中,派生类的对象会包含基类的子对象。C++使用了两种类型的继承:公有继承和私有继承。公有继承表示派生类可以访
2023-10-26

JavaScript实现继承的方法是什么

这篇文章主要介绍了JavaScript实现继承的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript实现继承的方法是什么文章都会有所收获,下面我们一起来看看吧。0. 继承继承是面向对象编
2023-07-04

es6中class继承调用super的原因是什么

本文小编为大家详细介绍“es6中class继承调用super的原因是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“es6中class继承调用super的原因是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-07-04

Java继承是什么及怎么实现

今天小编给大家分享一下Java继承是什么及怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.什么是继承所谓继承就是抽
2023-06-30

C++中继承的实现原理是什么

C++中继承的实现原理是通过创建一个新的类(派生类)来继承已有的类(基类)的属性和方法。派生类可以访问基类中的非私有成员,并且可以扩展或修改基类的功能。在C++中,派生类可以使用关键字class或struct来声明,并在类声明中使用关键字
C++中继承的实现原理是什么
2024-02-29

Hibernate继承关系树的映射方式是什么

这篇文章主要介绍“Hibernate继承关系树的映射方式是什么”,在日常操作中,相信很多人在Hibernate继承关系树的映射方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate继承关系
2023-06-17

php中继承类和实现接口的区别是什么

php中继承类和实现接口的区别:1、PHP继承属于单继承,保证了单一性,但不够灵活,而实现接口就是对单一继承的补充;2、实现接口可以在不破坏层级关系的前提下,对某个类功能扩展。
2017-08-21

C++ 中继承和多态性的实现机制是什么?

c++++ 中继承和多态性的实现机制:继承:通过继承说明符实现,派生类继承并扩展基类行为。多态性:通过虚函数表实现,基类指针动态调用派生类方法。实现案例:通过继承和多态性,可以创建形状类层次结构并编写函数计算任何形状的总面积。C++ 中继承
C++ 中继承和多态性的实现机制是什么?
2024-05-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录