ES6中class继承

news/2025/3/31 8:45:02/

 1.简介

说明:class可以通过extends关键字实现继承,让子类继承父亲的属性和方法

  class Fun {constructor(x, y) {this.x = xthis.y = y}talk() {console.log("talk方法");}tell() {console.log("tell方法");}}class Fun1 extends Fun {}const obj1 = new Fun1()obj1.talk() //talk方法

注意:Fun是父类,Fun1是子类,它通过extends关键字,继承了Fun所有属性和方法,等于复制Fun类。ES6规定,子类必须constructor方法中调用super(),否则就会报错。这是因为子类自己的this对象,必须先通过父类的构造函数来塑造。

1.1为什么一定要调用super()?

说明:ES6继承机制是先将父类的属性和方法,加到一个空对象上面,然后再将该对象作为子类的实例,即继承再前,实例在后。子类的构造函数中,只有调用super()方法之后,才可以使用this关键字。子类实例的构建,必须先完成父类的继承,只有具有了super方法才能让子类实例继承父类。

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

说明:父类所有的属性和方法,都会被子类继承,除了私有的属性和方法。

    class Fun2 {#name = "李四"name = "王二"#talk() {console.log("我是私有talk方法");}talk() {console.log("我是公有talk方法");}getMethod() {console.log(this.#name); //李四}}class Fun3 extends Fun2 {}class Fun4 extends Fun2 {constructor() {super()//     console.log(this.#name);//Private field '#name' must be declared in an enclosing class }}const obj3 = new Fun3()console.log(obj3); //Fun3

说明:因此,子类无法直接访问这些私有属性和方法,但可以通过继承关系间接地访问到它们(原型链)。

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

说明:静态属性是通过浅拷贝实现继承的,如果父类的静态属性是一个对象的时候,那么子类的静态属性也会指向这个对象,浅拷贝只会拷贝对象的地址值。

4.Object.getPrototypeOf方法

说明:从子类获取父类。

 class Fun5 {}class Fun6 extends Fun5 {}console.log(Object.getPrototypeOf(Fun6) === Fun5); //true

注意:也可以认为Fun5是在Fun6的原型链上。

5.super关键字

说明:super关键字可以当对象使用和函数使用,用法不同。

  1. 情况1是super作为函数调用时,代表父类的构造函数。
  2. 情况2是suepr作为对象的,普通方法中,指向父类的原型对象,在静态方法中,指向父类。
  class Fun7 {tell() {console.log("我是父类的Fun7方法");}}class Fun8 extends Fun7 {constructor() {super()super.tell()   //等价于super.prototype.tell()}}const obj8 = new Fun8()obj8.tell()// Fun8.tell()// 我是父类的Fun7方法// 我是父类的Fun7方法

5.1super对象 

说明:super指向父类的原型对象,所有定义在父类实例上的方法或属性,是无法通过super调用的。

 class Fun9 {constructor(x) {this.x = 3}}Fun9.prototype.y = 5class Fun10 extends Fun9 {constructor() {super()}get value() {console.log(super.x);}}const obj10 = new Fun10()obj10.value //undefinedconsole.log(obj10.y);//5

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

5.2super对象方法赋值

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

   class Fun11 {constructor() {this.x = 1}}Fun11.prototype.layerA = 10class Fun12 extends Fun11 {constructor() {super()this.x = 2super.x = 30}talk() {console.log(super.x);  }talk1(){console.log(super.layerA);}}const obj12 = new Fun12()console.log(obj12.x); //30obj12.talk() //undefinedobj12.talk1() //10

注意:super对象在读值的情况下是找父类原型, super对象在赋值的情况下super指向的是子类的实例对象。子类的静态方法中通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类的实例。

6.类的prototype属性和__proto__属性

  1. 子类的__proto__属性,表示构造函数的继承,总是指向父类
  2. 子类prototype属性的__proto__属性,表示方法的继承,总是指向父类的prototype属性。 
    class Fun13 {}class Fun14 extends Fun13{}console.log(Fun14.__proto__===Fun13);//trueconsole.log(Fun14.prototype.__proto__===Fun13.prototype);//true

 7.实例的__proto__属性

说明:子类实例__proto__属性的__proto__属性,指向父类实例的__proto__属性。也就是说,子类实例对象的原型的原型,是父类实例对象的原型。

8.Mixin模式的实现

说明:Mixin指的是多个对象合成一个新的对象,新对象具有各个组成成员的接口,它的最简单实现如下。

 const arr1=[1]const arr2=[2]const arr3=[...arr1,...arr2]


http://www.ppmy.cn/news/77898.html

相关文章

数据分析真的很火吗?真的有很多企业需要这样的岗位吗?求大佬指点。

“我是去年毕业的,因为疫情影响,整个就业环境都很不好,很多企业都裁员了。加上疫情三年基本都是玩过去,也没啥一技之长,就业就更难了。听说现在做数据分析的人很多,我身边的朋友都在转行做数据分析。 其实…

为什么要放弃 $ 语法糖提案

《最新,Vue 中的响应性语法糖已废弃》 本文标题中的 $ 语法糖指的就是上文中的响应式语法糖 (Reactivity Transform),那为什么不写 Reactivity Transform 呢?因为这个名实在是太长了… 大家觉得被废弃是因为分不清是正常变量还是响应式变量…

C++ STL篇

C STL篇 1 STL1.1 STL的诞生1.2 STL基本概念1.3 STL六大部件1.4 容器概念1.5 算法概念1.6 迭代器概念 2 初识容器算法迭代器2.1 vector存放内置数据类型2.2 vector存放自定义数据类型2.3 Vector容器嵌套 3 string容器3.1 string构造函数3.2 string赋值操作3.3 string字符串拼接…

Linux网络基础-4

在之前的网络基础博客中,我们对网络进行了概要解释,了解了应用层和传输层的知名协议。接下来我们来对网络层的典型协议进行解析。 目录 1.网络层协议 2.IP协议 2.1协议格式 2.2地址管理 2.3特殊网络 2.3.1私网的组建 2.3.2特殊IP地址 2.4路由选…

香港服务器如何操作域名解析让网站上线?

​  网站上线是一个需要多个步骤的过程,其中之一就是解析IP。在这个过程中,您需要将您的网站域名解析到香港服务器IP地址,以便访问者可以通过域名来访问您的网站。 下面是解析IP的一般步骤: 1. 获取服务器IP地址:首先…

SpringBoot 3.1现已推出,惊艳新特性带来前所未有的开发体验

一、介绍 1.1 新特性概述 经过半年的沉淀 Spring Boot 3.1于2023年5月18日正式发布了,带来了许多令人兴奋的新特性和改进。本篇博客将详细介绍Spring Boot 3.1的新特性、升级说明以及核心功能的改进。 同时,2.6.x 版本线已经停止维护了,最新…

八股总结(五)java基础、集合、并发、JVM

文章目录 接口、类与继承java中创建对象有哪几种方式? 和equal区别是什么?hashCode()为什么重写equals方法必须重写hashcode方法?String为什么设计成不可变的?String,StringBuffer,StringBuilder的区别是什么&#xf…

Java企业工程项目管理系统+spring cloud 系统管理+java 系统设置+二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…