【React】class组件extends继承原理

embedded/2025/1/20 6:25:14/

目录

  • class语法
  • 基于extends实现继承

在学习React中的 class组件时,先巩固一下ES6中class语法和继承原理,后面介绍如何基于extends实现继承。

class语法

静态属性和方法是属于类本身的,而不是类的实例对象。静态成员通常用于描述类的特征或功能,而不是描述某个具体实例的状态。它们是通过 class 关键字直接定义在类上,而不是通过 constructor 或实例方法定义。实例对象的·__proto__(原型链)会指向类的原型对象(Parent.prototype),但静态成员 不 会出现在实例对象或其原型链中。静态成员只能通过类本身来访问,而不能通过实例来访问。

javascript">class Parent{// new的时候,执行的构造函数「可写可补血,需要接受传递尽量的实参信息,才需要设置constructor」constructor(x,y){// this-> 创建的实例// 创建私有属性totalthis.total = x+y;}num = 200;// 等价于this.num=2000;getNum=()=>{//添加私有属性getNum//箭头函数没有自己的this,所用到的this是宿主函数中的console.log(this);}sum(){//类似sum= function(){}不是箭头函数//它是给Parent.prototype上设置公共方法「sum不是可枚举的」}  static avg = 10000;//把构造函数当作一个普通对象,为其设置静态的私有属性方法 ,Parent.averagestatic average(){}
}let p = new Parent();console.log(p,'p')console.dir(Parent,'Parent')
javascript">访问类的静态属性
console.log(Parent.avg);  // 10000
Parent.average();  // 调用静态方法

实例p打印如下:
在这里插入图片描述
Parent打印如下
在这里插入图片描述

基于extends实现继承

javascript">class Parent extends React.Component{constructor(props){super(props);//继承 React.Component 构造器,初始化 props}x=100;getX(){ }
}let p = new Parent(10);
console.log(p)

1、首先基于call继承 React.Component.call(this),其中this->Parent类的实例p,给创建的实例p设置四个私有属性:props、context、refs、updater

Component 的源码如下:

javascript">  function Component(props,context,updater){this.props = props; // 存储传入的 props(组件的属性)this.context = context; // 存储上下文对象(用于跨组件传递数据)this.refs = emptyObject; // 存储组件引用,用于获取子组件实例或 DOM 节点this.updater = updater || ReactNoopUpdateQueue;//ReactNoopUpdateQueue,这是一个默认的更新队列,用于在 React 中触发组件更新。}

2、再基于原型继承Parent.prototype._proto_ === React.Component.prototype

通过 call 继承完成初始化之后,实例的__proto__会指向 Parent.prototype,同时 Parent.prototype 的 __proto__ 会指向 React.Component.prototype,还备React.Component.prototype原型上提供的方法(isReactComponentsetStateforceUpdate),原型链的指向:实例-> Parent.prototype->React.Component.prototype->Object.pototype;

3、只要设置了 constructor,则内部第一句话一定要执行super()

  • super(props) 会调用父类(React.Component)的构造函数,确保父类的初始化逻辑(即 React.Component.call(this))被执行,同时将 props 传递给父类的构造函数。
  • 如果没有定义 constructor,JavaScript 会自动提供一个默认的构造函数,它会隐式调用 super()
javascript">class Parent extends React.Component{// constructor(n,m){// 调用父类(React.Component)的构造函数// 	super()  //=>React.Component.call(this),此时this.props=undefined,this.context=undefined this.refs={}// 	// super(10) 此时this.props = 10;// }constructor(props){//确保父类构造函数被调用,this.props 会被正确初始化super(props);}x=100;getX(){ }
}let p = new Parent(10);
console.log(p)

总结一下:

  • 继承的实现:通过 extends React.Component,子类 Parent 继承了 React.Component,并且拥有了 React.Component 中定义的所有生命周期方法(如 componentDidMount、render 等)以及 setStateforceUpdate 等方法。

  • 调用 super(props):在子类 Parent 的构造函数中,super(props) 调用了 React.Component 的构造函数,使得 this.props 得到正确初始化。这个步骤是必须的,因为没有它,this.props 会是 undefined

  • 原型链:当 Parent 类实例化时,它会继承 React.Component.prototype 上的所有方法。原型链结构是:实例 -> Parent.prototype -> React.Component.prototype -> Object.prototype


http://www.ppmy.cn/embedded/155403.html

相关文章

IOS工程师

IOS工程师 职位描述 负责程序的开发测试调试工作。 负责后期维护 任职要求 有扎实的Objective-C/Swift语言基础 熟悉IOS开发技术,包括UI、网络等方面 熟悉IOS开发工具和相关开发测试工具的使用 熟悉多线程和网络编程,对高性能程序设计、架构有较多…

WebSocket实现分布式的不同方案对比

引言 随着实时通信需求的日益增长,WebSocket作为一种基于TCP的全双工通信协议,在实时聊天、在线游戏、数据推送等场景中得到了广泛应用。然而,在分布式环境下,如何实现WebSocket的连接管理和消息推送成为了一个挑战。本文将对比几…

el-tree树结构在名称后面添加其他文字

//在 el-tree 中使用 render-content 插槽来展示文件大小 <template><div><el-treeref"tree"v-loading"treeData.loading":data"treeData.data"node-key"id" :props"defaultProps":render-content"rend…

【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验

一、背景&#xff1a;当“审判”成为科学 1.1 虚拟场景——法庭审判 想象这样一个场景&#xff1a;有一天&#xff0c;你在王国里担任“首席审判官”。你面前站着一位嫌疑人&#xff0c;有人指控他说“偷了国王珍贵的金冠”。但究竟是他干的&#xff0c;还是他是被冤枉的&…

MongoDB单机版安装

MongoDB单机版安装 在CentOS Linux release 7.9.2009 (Core)下安装MongoDB的步骤如下&#xff1a; 1 创建用户和组&#xff08;可选&#xff0c;根据需要&#xff09; 如果您希望以非root用户运行MongoDB服务&#xff0c;可以创建一个专用的用户和组。 groupadd mongodb us…

Python毕业设计选题:基于django+vue的宠物服务管理系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 宠物商品管理 医疗服务管理 美容服务管理 系统…

网络协议基础--HTTP协议

一.HTTP介绍 HTTP 是基于 TCP/IP 协议栈之上的应用层协议&#xff0c;旨在规定客户端和服务器之间请求和响应的标准格式与交互方式&#xff0c;以实现超文本&#xff08;包含文本、图片、音频、视频等多种格式的文档&#xff09;的传输&#xff0c;让用户能够在浏览器中轻松访问…

Windows 11 安装GTK+3.0 和VScode开发GTK+3.0配置

Windows 11 安装GTK+3.0 和VScode开发GTK+3.0配置 安装msys2下载msys2安装安装msys2安装编译器gcc安装调试器gdb安装GTK+3.0安装C/C++开发GTK+3.0工具配置路径验证GTK+3.0安装验证配置运行GTK DemoVScode配置测试代码文件test.c任务配置文件tasks.jsongdb调试配置文件launch.js…