react学习笔记——复习模块

news2024/10/7 10:18:00

前言:最近开始学习react,之前学习vue没有把笔记整理的特别好,非常后悔,感觉学了等于没学,这次要好好整理啊!本次学习参考教程为B站,张天禹老师的react全家桶。

文章目录

    • 类的基本知识
      • 创建一个类
      • 类的构造方法和一般方法
      • 类的继承
      • 总结
    • 原生事件绑定
    • 类中方法的this指向
    • 类中的属性
    • 展开运算符
    • 对象相关知识

类的基本知识

创建一个类

  • 定义一个Person类,然后实例化一个这个类的对象p1,并对这个对象进行输出后,查看控制台。代码如下:
// 创建一个person类
class Person {

}
// 创建一个person的实例对象
const p1 = new Person();
console.log(p1);
  • 控制台打印效果如下。
    • 注意,这里输出的不是这个类,而是这个类的实例对象。
    • 前面的Person是为了区分这个对象是由哪个类new出来的。

在这里插入图片描述

类的构造方法和一般方法

  • 给Person类添加构造方法和一般方法,并调用一般方法。代码如下:
// 创建一个person类
class Person {
    // 构造器方法(函数)
    constructor(name, age) {
        // 构造器中的this是谁?——是类的实例对象,例如下面的p1和p2
        this.name = name;
        this.age = age;
    }
    // 一般方法(除了构造器以外的方法)
    speak() {
        // 一般方法(speak方法)放在了哪(通过打印p1是看不到speak的)?——放在了这个类的原型对象上,需要展开Prototype才能看到
        // 一般方法(speak方法)是给谁用的?——放在原型对象上的方法是给实例对象用的
        // 通过person实例调用speak时,speak中的this就是实例对象
        // 注意原型链查找规则:当读取自身不存在的属性或方法,则按照原型链进行查找。
        console.log(`我叫${this.name},我的年龄是${this.age}`);
    }
}
// 创建一个person的实例对象
const p1 = new Person('tom', 18);
console.log(p1);
p1.speak();
p1.speak.call({ a: 1, b: 2 });
  • 控制台打印效果如下。
    • 注意,构造方法中的this是实例对象,例如代码中的p1和p2。而一般方法通过实例调用时,方法中的this才是实例对象。因为可以通过一般方法.call()等方法来更改函数中的this指向,例如p1.speak.call({a:1,b:2}),这时候,speak中的this指向的是{a:1,b:2}对象。
    • 方法并没有在类中展示出来,而是Person这个类的原型对象上,供实例使用。
    • 原型链的查找规则:当读取自身不存在的属性或方法,则按照原型链进行查找。

在这里插入图片描述

类的继承

  • 创建一个Student类,继承Person类,这时候Student中就有了name、age等属性以及speak方法。因为继承了Person。
  • Student类需要一个年级的属性,因此需要重新写一个Student的构造器。这时候必须要调用父类的构造器(如果定义了一个类并进行了继承,并且子类需要写构造器,则子类构造器必须调用父类的构造器。并且父类构造器要放在最上面)。
  • 学生也可以进行speak,并且调用的是父类的speak,并且speak方法是在父类的原型对象上,这里需要一层一层的网上找,也就是原型链。
// 创建一个person类
class Person {
    // 构造器方法(函数)
    constructor(name, age) {
        // 构造器中的this是谁?——是类的实例对象,例如下面的p1和p2
        this.name = name;
        this.age = age;
    }
    // 一般方法(除了构造器以外的方法)
    speak() {
        // 一般方法(speak方法)放在了哪(通过打印p1是看不到speak的)?——放在了这个类的原型对象上,需要展开Prototype才能看到
        // 一般方法(speak方法)是给谁用的?——放在原型对象上的方法是给实例对象用的
        // 通过person实例调用speak时,speak中的this就是实例对象
        // 注意原型链查找规则:当读取自身不存在的属性或方法,则按照原型链进行查找。
        console.log(`我叫${this.name},我的年龄是${this.age}`);
    }
}
// 创建一个person的实例对象
const p1 = new Person('tom', 18);
console.log(p1);
p1.speak();
p1.speak.call({ a: 1, b: 2 });
// --------------------------------
// 创建一个Student类,继承Person类
class Student extends Person {
    constructor(name, age, grade) {
        // 什么时候需要调用父类构造器?——如果定义了一个类并进行了继承,并且子类需要写构造器,则子类构造器必须调用父类的构造器。并且父类构造器要放在最上面
        super(name, age);// 调用父类构造器
        this.grade = grade;
    }
}

const s1 = new Student("张三", 15, '高一');
console.log(s1);
// 这里注意,speak方法是在父类的原型对象上,这里需要一层一层的网上找,也就是原型链
s1.speak();
  • 控制台输出效果如下:

在这里插入图片描述


  • 学生还需要再说出自己的年级,则需要重写父类的方法,此时Student原型对象上就有speak方法了,根据原型链查找规则,找到了就不继续找了。代码如下:
// 创建一个person类
class Person {
    // 构造器方法(函数)
    constructor(name, age) {
        // 构造器中的this是谁?——是类的实例对象,例如下面的p1和p2
        this.name = name;
        this.age = age;
    }
    // 一般方法(除了构造器以外的方法)
    speak() {
        // 一般方法(speak方法)放在了哪(通过打印p1是看不到speak的)?——放在了这个类的原型对象上,需要展开Prototype才能看到
        // 一般方法(speak方法)是给谁用的?——放在原型对象上的方法是给实例对象用的
        // 通过person实例调用speak时,speak中的this就是实例对象
        // 注意原型链查找规则:当读取自身不存在的属性或方法,则按照原型链进行查找。
        console.log(`我叫${this.name},我的年龄是${this.age}`);
    }
}
// 创建一个person的实例对象
const p1 = new Person('tom', 18);
console.log(p1);
p1.speak();
p1.speak.call({ a: 1, b: 2 });
// --------------------------------
// 创建一个Student类,继承Person类
class Student extends Person {
    constructor(name, age, grade) {
        // 什么时候需要调用父类构造器?——如果定义了一个类并进行了继承,并且子类需要写构造器,则子类构造器必须调用父类的构造器。并且父类构造器要放在最上面
        super(name, age);// 调用父类构造器
        this.grade = grade;
    }
    // 重写父类继承的方法,此时Student原型对象上就有speak方法了,根据原型链查找规则,找到了就不继续找了
    speak() {
        console.log(`我叫${this.name},我的年龄是${this.age},我读的年级是${this.grade}`);
    }
}

const s1 = new Student("张三", 15, '高一');
console.log(s1);
// 这里注意,speak方法是在父类的原型对象上,这里需要一层一层的网上找,也就是原型链
s1.speak();
  • 控制台打印效果如下:

在这里插入图片描述


  • 学生还需要一个自己独有的方法,注意此方法的位置,以及方法中的this,代码如下:
// 创建一个person类
class Person {
    // 构造器方法(函数)
    constructor(name, age) {
        // 构造器中的this是谁?——是类的实例对象,例如下面的p1和p2
        this.name = name;
        this.age = age;
    }
    // 一般方法(除了构造器以外的方法)
    speak() {
        // 一般方法(speak方法)放在了哪(通过打印p1是看不到speak的)?——放在了这个类的原型对象上,需要展开Prototype才能看到
        // 一般方法(speak方法)是给谁用的?——放在原型对象上的方法是给实例对象用的
        // 通过person实例调用speak时,speak中的this就是实例对象
        // 注意原型链查找规则:当读取自身不存在的属性或方法,则按照原型链进行查找。
        console.log(`我叫${this.name},我的年龄是${this.age}`);
    }
}
// 创建一个person的实例对象
const p1 = new Person('tom', 18);
console.log(p1);
p1.speak();
p1.speak.call({ a: 1, b: 2 });
// --------------------------------
// 创建一个Student类,继承Person类
class Student extends Person {
    constructor(name, age, grade) {
        // 什么时候需要调用父类构造器?——如果定义了一个类并进行了继承,并且子类需要写构造器,则子类构造器必须调用父类的构造器。并且父类构造器要放在最上面
        super(name, age);// 调用父类构造器
        this.grade = grade;
    }
    // 重写父类继承的方法,此时Student原型对象上就有speak方法了,根据原型链查找规则,找到了就不继续找了
    speak() {
        console.log(`我叫${this.name},我的年龄是${this.age},我读的年级是${this.grade}`);
    }
    study() {
        // speak放在了类的原型对象上,供实例使用
        // 通过student实例调用study时,study中的this就是实例对象
        console.log("我很努力的学习");
    }
}

const s1 = new Student("张三", 15, '高一');
console.log(s1);
// 这里注意,speak方法是在父类的原型对象上,这里需要一层一层的网上找,也就是原型链
s1.speak();
s1.study();
  • 控制台输出效果如下:

在这里插入图片描述

总结

  1. 类中的构造器不是必须要写的,要对实例进行一些初始化的操作时才要写。例如添加指定属性。
  2. 如果A类继承B类,并且A类中有构造器,则A类中的构造器必须调用super方法。
  3. 类中所有定义的方法,都是放在了类的原型对象上,供类的实例对象使用。

原生事件绑定

  • 原生事件的绑定方式
    1. 拿到元素后,添加监听事件
    2. 拿到元素后,给元素添加点击事件
    3. 直接给元素添加点击事件,执行对应的js语句
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02_原生事件绑定</title>
</head>

<body>
    <button id="btn1">按钮1</button>
    <button id="btn2">按钮2</button>
    <button onclick="demo()">按钮3</button>
    <script>
        // 方式1:拿到元素以后,添加事件监听器
        const btn1 = document.getElementById("btn1");
        btn1.addEventListener('click', () => {
            alert("按钮1被点击了")
        })

        // 方式2:直接对元素添加点击事件
        const btn2 = document.getElementById("btn2");
        btn2.onclick = () => {
            alert("按钮2被点击了")
        }

        // 方式3:当点击的时候,执行demo()这个js语句
        function demo() {
            alert("按钮3被点击了")
        }
    </script>

</body>

</html>

类中方法的this指向

  • 只有使用实例调用方法的时候,this才是实例对象本身
  • 通过将方法重新赋值给变量,然后变量调用的方式,this是undefined,原因如下。
    • 因为其实给x的是一个方法(特殊的属性),然后x加括号则是直接调用。因此不是实例对象调用的,所以不会是实例对象本身。
    • 内存结构图分析:
      • 其实方法在堆内存中,然后栈中可以通过p1进行引用,但是赋值以后,栈中多了一个x的引用,x会直接引用堆内存,而不走实例对象进行引用
    • 直接调用那么this应该是window,而这里为什么不是window,而是undefined。
      • 因为类中所有的定义的方法,在方法的局部都开启了严格模式,因此this不会指向window。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>03_类中方法的this指向</title>
</head>

<body>
    <script>
        class Person {
            constructor(name, age) {
                this.name = name
                this.age = age
            }
            speak() {
                // speak方法放在哪?——类的原型对象上,供实例使用
                // 通过Person实例调用speak时,speak中的this就是Person实例
                console.log(this);
            }
        }
        const p1 = new Person("tom", 18);
        p1.speak();// 通过实例调用speak方法
        const x = p1.speak;
        x();// 这种方式,speak中的this就是undefined了
        /**
         * 为什么赋值给x的形式无法让speak中的this输出实例对象?
         *      因为其实给x的是一个方法(特殊的属性),然后x加括号则是直接调用。
         *      内存结构图分析:
         *          其实方法在堆内存中,然后栈中可以通过p1进行引用,但是赋值以后,栈中多了一个x的引用,x会直接引用堆内存,而不走实例对象进行引用
         * 为什么输出的是undefined?
         *      类中所有的定义的方法,在方法的局部都开启了严格模式,因此this不会指向window。
        */
    </script>
</body>

</html>

类中的属性

  • 如果初始化的属性,是需要通过传递过来的,则就需要构造器
  • 如果不是外部传递进来的,则可以直接通过赋值的形式
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>04_类中的属性</title>
</head>

<body>
    <script>
        class Car {
            // 如果初始化的属性,是需要通过传递过来的,则就需要构造器
            constructor(name, price) {
                this.name = name
                this.price = price
            }
            // 如果不是外部传递进来的,则可以通过如下形式
            // 往实例自身上追加一个属性,名为wheel,值为4,这样所有的实例都会有wheel属性
            wheel = 4
        }
        const c1 = new Car('奔驰c63', 199);
        console.log(c1);
    </script>
</body>

</html>

展开运算符

  • 展开运算符也就是“…”。其主要用法包含以下4种
    1. 将数组展开进行输出,其实输出的是多个数,而不是一个数组
    2. 连接两个数组
    3. 函数传参,批量传递多个参数
    4. 进行对象复制,注意这里是深度复制
    5. 复制对象,同时修改属性,或者新增属性。其实就是合并两个对象,冲突的话以后面的为准
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>05_展开运算符</title>
</head>

<body>
    <script>
        let arr1 = [1, 3, 5, 7, 9];
        let arr2 = [2, 4, 6, 8, 10];
        // 1. 将数组展开进行输出,其实输出的是多个数,而不是一个数组
        console.log(...arr1);

        // 2.连接两个数组
        let arr3 = [...arr1, ...arr2];
        console.log(arr3);

        // 3. 函数传参,批量传递多个参数
        function sum(...numbers) {
            // 计算数组中所有数值的和,可以使用数组身上的reduce方法,reduce中有两个参数,一个是之前的值,一个是当前的元素的值。注意这个之前的值,指的是之前的计算结果。
            return numbers.reduce((preValue, currentValue) => {
                return preValue + currentValue
            })
        }
        console.log(sum(1, 2, 3));

        // 4. 进行对象复制,注意这里是深度复制
        let person = { name: "tom", age: "18" }
        // console.log(...person); // 展开运算符号不能展开一个对象
        let person2 = { ...person }// 因为这里加了一个花括号,就是复制对象了
        person.name = "jerry";
        console.log(person);
        console.log(person2);

        // 5. 复制对象,同时修改属性,或者新增属性。其实就是合并两个对象,冲突的话以后面的为准
        let person3 = { ...person, name: "张三", address: "南京" }
        console.log(person3);
    </script>
</body>

</html>

对象相关知识

  • 需求:对象中添加一个key,并且这个key是从一个变量中拿的。
  • 代码如下:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>06_对象相关知识</title>
</head>

<body>
    <script>
        let a = 'name';
        let obj = {}
        // 要求obj变成:{name:'tom'},而这里的name是变量a中的内容
        // 实现代码如下:
        obj[a] = 'tom';// 这里就需要用到方括号
        console.log(obj);
    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/743846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间序列分类 论文和数据集汇总

时间序列分类 时间序列广泛应用于金融、工业领域、健康、运维、交通领域。 其实异常检测任务也可以看作是一个时间序列分类任务&#xff0c;异常与否两类&#xff0c;或者异常有很多种&#xff0c;则是多分类问题。 时间序列分类的数据是多种的&#xff1a;时间轨迹数据&#x…

Real-time Short Video Recommendation on Mobile Devices 阅读笔记

摘要 用户会实时兴趣转移&#xff0c;为实现在客户端重排&#xff0c;提出一种 context-aware re-ranking 方法&#xff0c;基于 adaptive beam search 1 引言 1.1 之前架构的问题&#xff1a; 1&#xff0c;需解决 real-time feedback 的问题 2&#xff0c;速度问题 1.2…

【Spring Boot】开发环境热部署

开发环境热部署 在实际的项目开发调试过程中会频繁地修改后台类文件&#xff0c;导致需要重新编译、重新启动&#xff0c;整个过程非常麻烦&#xff0c;影响开发效率。下面介绍Spring Boot如何解决这个问题。 1.devtools实现原理 我们在开发调试Spring Boot项目时&#xff0…

Flink 系列三 Flink 实战

目录 ​编辑 前言 1、安装flink环境 2、在idea中创建flink的第一个demo 2.1、执行如下maven命令 2.2、填写groupId、artifactId、version、package 2.3、选择Yes即可生成创建好的工程 3、开发第一个flink程序 3.1、开发一个简单的统计程序 3.2、直接编译得到jar包 4、…

【Java基础】AQS (AbstractQueuedSynchronizer) 抽象队列同步器

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读1.1 CLH锁 二、概览三、使用场景3.1 AQS 对资源的共享方式…

【自我提升】JPA从搭建到CRUD快速入门(IDEA+MAVEN)

写在前面&#xff1a;今天又学习一点新的东西&#xff0c;方面日后查询和巩固学习&#xff0c;下面将学习过程记录下来。 一、创建MAVEN工程 1. 打开IDEA创建一个纯净的maven工程项目 2. 打开pom文件&#xff0c;导入maven坐标 注意&#xff1a;我使用的postgres数据库&#x…

【微服务】搭建项目以及子模块

目录 方法一&#xff1a;搭建远程仓库新建idea 项目创建子模块创建父模块的pom父模块的gitignore文件修改查看远程代码仓库 方法二 方法一&#xff1a; 搭建远程仓库 选择 下载地址 新建idea 项目 复制 项目远程仓库的下载地址 下载完成 创建子模块 导入微服务的必要组件…

Apache Pulsar 分布式部署

1.Pulsar 简介 Pulsar 是一个支持多租户的、高性能的消息中间件&#xff1b;最初是由 Yahoo 研发的开源&#xff0c;分布式pub-sub系统&#xff0c;现在是Apache的一个顶级开源项目 Pulsar 提供了四种订阅类型&#xff0c;它们可以共存在同一个主题上&#xff0c;以订阅名进行区…

【html页面引入vue3语法模板】在html页面中使用vue3语法和elementul-plus组件库的简单模板

前言 这是最近在看这些东西&#xff0c;因为看别的地方是用脚手架直接用的。 我这个项目想要在html上直接使用。 所以我就试了下如何在html上使用vue3语法 目前摸索出来的是这样可以使用。 记录下来供参考&#xff0c;如果有不好的地方后续改进 效果图 这里就是简单的试了一…

修改npm路径

npm config ls如果是第一次使用NPM安装包的话&#xff0c;在配置中只会看到prefix的选项&#xff0c;就是NPM默认的全局安装目录。但是如果有多次使用NPM安装包的话&#xff0c;就会看到cache和prefix两个路径。 新建两个文件夹node_global_modules和node_cache npm config s…

mac android studio设置跟mac系统一样的快捷键

mac版的android studio 跟mac系统的快捷键不一样,主要修改了下面几组操作,为了跟mac系统快捷键相同 setting->Keymap 搜索bottom 修改3个快捷键: cmd↓ 设置让鼠标移动到屏幕最后面 shiftcmd↓ 选中从当前位置到屏幕最下面 option↓. 或者 end 滚动到屏幕最下方 // 因为默认…

详解 HTTPS、TLS、SSL、HTTP区别和关系

一、什么是HTTPS、TLS、SSL HTTPS&#xff0c;也称作HTTP over TLS。TLS的前身是SSL&#xff0c;TLS 1.0通常被标示为SSL 3.1&#xff0c;TLS 1.1为SSL 3.2&#xff0c;TLS 1.2为SSL 3.3。下图描述了在TCP/IP协议栈中TLS(各子协议)和HTTP的关系。 二、HTTP和HTTPS协议的区别 …

【开源项目】中后台开发框架vue-next-admin

vue-next-admin 基本介绍 基于 vue3.x CompositionAPI setup 语法糖 typescript vite element plus vue-router-next pinia 技术&#xff0c;适配手机、平板、pc 的后台开源免费模板&#xff0c;希望减少工作量&#xff0c;帮助大家实现快速开发。 在线预览 账号: adm…

Braindecode系列 (1):在BCIC IV 2a数据集上进行试验

Braindecode系列&#xff1a;在BCIC IV 2a数据集上进行试验 0. 引言1. 环境介绍1.1 环境配置1.2 运行环境 2. Python实现2.1 加载和预处理数据集2.2 创建模型2.3 模型训练2.4 结果输出图像 3. 结果展示4. 总结 0. 引言 最近在看运动想象相关的论文时&#xff0c;找到了一个很好…

在线培训系统的保障措施带来安全、可靠的学习环境

在今天的数字时代&#xff0c;越来越多的人选择在线培训系统作为学习的方式。然而&#xff0c;随着在线教育市场的不断增长&#xff0c;安全和可靠性成为消费者普遍关心的问题。因此&#xff0c;在线培训系统需要采取一系列保护措施以确保学生的数据和隐私得到保护&#xff0c;…

Python 运算符(二)

文章目录 Python逻辑运算符Python成员运算符Python身份运算符Python运算符优先级后记 Python逻辑运算符 Python语言支持逻辑运算符&#xff0c;以下假设变量 a 为 10, b为 20: 运算符逻辑表达式描述实例andx and y 布尔"与" - 如果 x 为 False&#xff0c;x and y …

php周练

前言&#xff1a;博主个人小练&#xff08;纯小白&#xff09;。 目录 1.[SWPUCTF 2021 新生赛]gift_F12已解决2.[SWPUCTF 2021 新生赛]jicao3.[ZJCTF 2019]NiZhuanSiWei4.[SWPUCTF 2021 新生赛]no_wakeup5.[SWPUCTF 2021 新生赛]ez_unserialize 1.[SWPUCTF 2021 新生赛]gift_…

Ae 效果:CC RepeTile

风格化/CC RepeTile Stylize/CC RepeTile CC RepeTile&#xff08;CC 重复拼贴&#xff09;效果可对整个图层进行复制并扩展&#xff0c;通过重复拼贴来创建平铺效果。 ◆ ◆ ◆ 效果属性说明 Expand Right 向右扩展 设置图层向右扩展的距离。 Expand Left 向左扩展 设置图层…

VMware vCenter Server 7.0 Update 3n 下载 - 集中管理 vSphere 环境

VMware vCenter Server 7.0 Update 3n 下载 - 集中管理 vSphere 环境 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-7-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMware vCenter Server 是一款高…