四天学会JS高阶(学好vue的关键)——深入面向对象(理论+实战)(第三天)

news2024/11/16 3:35:18
 ***本章面试使用居多*  理论篇**

一、编程思想

1.1 面向过程 JS 前端居多

按照步骤
性能高 适合跟硬件关系很紧密
没有面向对象易维护易复用易扩展

1.2 面向对象 java典型

按照功能,把事务分别成一个个对象,对象之间分工合作
比较灵活 适合多人合作的大型软件项目
三大特性:
想象将拖拉机改装成了扫地机理解特性
封装性
继承性
多态性 多种功能

二者区别:打游戏刚开始是面向对象的,中期互相帮忙的时候变成了面向过程

二、构造函数

封装是面向对象的比较重要一部分,js面向对象可以通过构造函数实现封装
1.构造函数体现了面向对象的封装性
2.构造函数实现的对象互不影响

   //构造函数  公共的属性和方法封装到构造函数
        function Star (uname, age) {
            this.uname = uname
            this.age = age
            this.sing = function () {
                console.log('唱歌')
            }
        }
        // 只要一new  就创建了一个实例对象
        const ldh = new Star('刘德华', 60)
        const zxy = new Star('张学友', 60)
        // 各个对象之间互不影响
        console.log(ldh === zxy)
        // 理论上是一样的  false  说明不一样 各个对象之间的属性互不影响
        console.log(ldh.sing === zxy.sing);

构造函数创建有问题:浪费内存,如果里面的属性是添加方法的话,因为函数属于复杂数据类型,所以需要先将内存的地址存到栈中,实际上的函数存到了堆中 如果对象有100个,这样就不浪费了内存 如果只是单纯的属性名属性值用完就销毁。

在这里插入图片描述
在这里插入图片描述
JS实现面向对象通过构造函数,但是构造函数会有浪费内存(复杂数据类型),创建一个对象开一个内存去存funciton()

所以所有的对象使用同一个函数,需要节省内存,我们就引入到了原型:

三、原型

构造函数里面浪费内存的问题,对象中的方法。
目标:能够利用原型对象实现方法(就是函数)共享。

3.1 原型

定义:
一些共享的属性或者方法不应该写在构造函数上 ,写在原型上 原型是一个对象,所以称为原型对象。
构造函数都有一个prototrpe属性,这就是原型 ——原型对象

 <script>
        //构造函数  公共的属性和方法封装到构造函数
        // 公共的属性写在构造函数中  公共的方法写在原型对象身上
        function Star (uname, age) {
            this.uname = uname
            this.age = age
            // this.sing = function () {
            //     console.log('唱歌')
            // }
        }
        // 构造函数的属性prototype对象  这个对象可以挂载函数 是对象 可以使用对象.属性的方式进行赋值  相当于给对象追加属性  只调用一个
        Star.prototype.sing = function () {
            console.log('唱歌')
        }
        // 只要一new  就创建了一个实例对象
        const ldh = new Star('刘德华', 60)
        const zxy = new Star('张学友', 60)
        ldh.sing()
        zxy.sing()
        // 各个对象之间互不影响
        console.log(ldh === zxy)
        // 理论上是一样的  false  说明不一样 各个对象之间的属性互不影响  //true
        console.log(ldh.sing === zxy.sing)
        // 写法是一个属性 但打印出来是一个对象
        console.dir(Star.prototype)
    </script>

原型的作用:共享方法 把那些不变的方法直接定义在prototype对象上
构造函数和原型里面的this指向谁?实例化的对象
案例:数组里面没有直接的方法,我们自己写一个:
只要一执行 就能够求和 自定义求和 求最大值
任何对象都能使用 放在prototype对象上

求最值

 //自己定义  数组扩展方法 和最大值
        // 1.我们定义的这个方法  任何一个数组实例对象都可以使用
        // 2.自定义的方法 写到数组.protot ype上
        // 1.求最大值
        const arr = [1, 23]
        // 同const arr = new Array(1, 2)
        Array.prototype.max = function () {
            //展开运算符  死记硬背
            return Math.max(...this)
            // 原型函数里面的this 指向实例对象 Array
        }
        console.log(arr.max())
        console.log([2, 6, 8].max());

求和

 // 求和方法
        Array.prototype.sum = function () {
            return this.reduce((prev, item) => prev + item, 0)
        }
        console.log([1, 2, 3].sum());

打印的两种方式和区别
前者打印出的是外部结构 后者打印出的是让人更容易理解 例如:数组 前者打印出的是 [ 内容 ],后者是Array 所以当我们想要打印的是函数或者对象的时候,最好使用dir打印 看的更清楚

 const arr = [1, 223, 543]
        console.log(arr)
        console.dir(arr);

3.2 constructor属性

constructor属性告诉prototype对象他的爸爸是谁)——是构造函数
使用场景:
利用原型封装属性时,属于赋值,这样修改后的原型对象就不在指向构造函数了

 <script>
        // constructor  构造函数
        function Star () {

        }
        // Star.prototype.sing = function () {
        //     console.log('唱歌')
        // }
        // Star.prototype.dance = function () {
        //     console.log('跳舞')
        // }
        console.log(Star.prototype)
        Star.prototype = {
            //重新指回创造这个原型对象的 构造函数
            constructor: Star,
            sing: function () {
                console.log('唱歌')
            }, dance: function () {
                console.log('跳舞')
            }
        }
        console.log(Star.prototype)


        // const ldh = new Star()
        // // console.log(Star.prototype);
        // console.log(Star.prototype.constructor === Star);

    </script>

3.3 对象原型

为什么实例对象可以访问原型上的方法:对象原型
包含在实例对象中

  __proto__

里面有一个constructor 所有的实例对象都可以访问原型对象
实例对象中的__proto__属性可以获取构造函数的prototype原型对象
原型对象里面装的是公共属性 原型对象是由构造函数得来的· 实例对象中说原型对象不适用prototype,使用__proto__ 所以既然有这个属性 那么打印实例对象的时候就会打印出原型对象 在浏览器中显示是prototype
在这里插入图片描述
结合上面图示搞懂之间的关系

function Person () {
            this.name = name
        }
        const peppa = new Person('佩奇')
        console.log(peppa)
        console.log(Person.prototype.constructor === Person)
        //实例对象 构造函数   原型对象之间的关系
        console.log(peppa.__proto__ === Person.prototype)
        console.log(peppa.__proto__.constructor === Person);

3.4 原型继承

构造了两个分别是Man、Woman的构造函数,里面有很多类似属性,也就是公共属性,需要封装到一个对象上,然后将这个对象赋值给原型对象,实例对象通过原型对象获得公共属性。即为原型继承
注意:因为是对象赋值,那么就会把原来原型对象可以指向构造函数的属性失去,还需要给它指回去。

  <script>
        // 继续抽取   公共的部分放到原型上
        const Person = {
            eyes: 2,
            head: 1

        }
        //女人 构造函数  想要继承Person
        function Woman () {

        }
        //woman  通过原型来继承Person  把公共属性给了原型对象
        Woman.prototype = Person
        // 指回原来的构造函数
        Woman.prototype.constructor = Woman
        const red = new Woman()
        // console.log(red.eyes)
        // console.log(Woman.prototype === red.__proto)
        console.log(red)
        console.log(Woman.prototype)
        //男人
        function Man () {

        }
        Man.prototype = Person
        Man.prototype.constructor = Man
        const pink = new Man()
        // console.log(pink);
        console.log(pink);

    </script>

赋值时,使用同一个对象所以添加其中一个原型对象的属性 另外一个也要添加 所以不能是同一个Person
在这里插入图片描述
结构相同 但是不同对象里面包含相同属性和方法——采用构造函数 new每次都会创建一个新的对象

  <script>
        // 继续抽取   公共的部分放到原型上
        // const Person1 = {
        //     eyes: 2,
        //     head: 1
        // }
        // const Person2 = {
        //     eyes: 2,
        //     head: 1
        // }
        // 结构相同 对象不同
        function Person () {
            this.eyes = 2
            this.head = 1
        }
        console.log(new Person())
        //女人 构造函数  想要继承Person
        function Woman () {

        }
        //woman  通过原型来继承Person  把公共属性给了原型对象
        //父构造函数(父类)  子构造函数
        //子类的原型=new 父类()
        Woman.prototype = new Person()
        // 指回原来的构造函数
        Woman.prototype.constructor = Woman
        Woman.prototype.baby = function () {
            console.log('宝贝')
        }
        const red = new Woman()
        console.log(red)
        //男人
        function Man () {
        }
        Man.prototype = new Person()
        Man.prototype.constructor = Man
        const pink = new Man()
        console.log(pink);
    </script>

3.5 原型链

为什么Object对象是最大的对象?

只要是原型对象就有constructor,指向构造函数 只要是对象有__proto__ 指向原型对象

公共属性会被放在prototype
死记硬背:只要原型对象上有这个公共属性,只要在原型链上的对象都可以使用

在这里插入图片描述

原型链是什么:查找规则 查找属性或者方法的一条路 先从自身原型对象 如果没有 就往上一层查找 如果有就使用 如果没有 就去往上上一层查找 在上面一层能查最后的任何一个地方 在没有 再去最大的一层查找 因为有原型链的存在 实例对象可以实现最上一层的方法 往上查找到null就没有这个属性了。

在这里插入图片描述
instanceof运算符 是用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上
死记硬背:换句话就是在这条原型链上,因为原型链的存在,对象和实例对象 以及原型对象之间可以互相指向,所以直接简单理解为 小对象 instanceof 大对象 小对象属与大对象 结合原型链

console.log(ldh instanceof Person)
        console.log(ldh instanceof Object)
        console.log(ldh instanceof Array)
        console.log([1, 2, 3] instanceof Array)
        console.log(Array instanceof Object)  //万事皆对象

四、 综合案例

首先模态框里面有open方法和close方法
模态框使用构造函数
open方法和close方法使用构造函数的原型对象上 这样,每一个模块狂都可以使用open和close方法
不理解的是:构造函数提到了模态框 两个方法中=》模态框

模态框业务 构造函数

使用构造函数创建模态框内容
使用this 才能使得创建不同的盒子都可以轻松利用构造函数 而不是const

打开oppen 显示

将创建的模态框显示在页面中
在这里:为什么要将属性放在构造函数中,将方法放在原型对象中?首先就要想到是由于原型对象的特性,它是用于共享属性和方法,所以如果对于每个实力来说,属性如果是唯一的,就放在构造函数中,不是唯一,就放在原型对象上。

关闭 模态框 挂载

思路:关闭模态框的时候 因为是要出现模态框才能关闭 所以关闭语句要在open方法中写

难点理解:我们使用箭头函数 这样便于this指向实例对象 而不是箭头函数的调用者i,这样才可以调用close方法

出现的bug,多次点击会出现多个模态框 解决:准备open的时候 先判断页面中有没有modal盒子 有就移除 没有就添加
为什么是在open的时候来判断 是因为点击open方法的时候才会有模态框

 <button id="delete">删除</button>
    <button id="login">登录</button>
    <button id="add">新增</button>
    <!-- <div class="modal">
    <div class="header">温馨提示 <i>x</i></div>
    <div class="body">您没有删除权限操作</div>
  </div> -->
    <script>
        // 1.modal构造函数封装——模态框
        function Modal (title = '', message = '') {
            console.log(title, message)
            //创建modal模态框盒子
            // 1.1 创建div标签
            // 因为是构造函数 所以使用this  this经过new 谁new谁是实例对象  两个不同的盒子 this指向当前的盒子
            this.modalBox = document.createElement('div')
            // 1.2 给div标签添加类名为modal
            this.modalBox.className = 'modal'
            // 1.3  modal盒子内部填充 2个div标签并且修改文字内容
            this.modalBox.innerHTML = `
    <div class="header">${title} <i>x</i></div>
    <div class="body">${message}</div>`
            console.log(this.modalBox)
        }
        // new Modal('温馨提示', '您没有权限删除操作')
        // new Modal('友情提示', '您还没登录呢')
        //  当我们打印函数时,想要知道里面的属性使用dir
        // console.dir(Modal)
        // 2.给构造函数原型对象挂载open方法  this指向函数的调用者 函数的调用者是实例对象
        Modal.prototype.open = function () {
            console.log(this)
            // 先判断页面中有没有modal盒子 有就移除  没有就添加
            const box = document.querySelector('.modal')
            // 逻辑与中断  如果有 就执行remove  没有就执行中断这条语句 继续执行下面的语句
            box && box.remove()
            //注意这个方法不要用箭头函数
            //把刚才创建的modalBox显示到页面body中
            document.body.append(this.modalBox)
            // 要等着盒子显示出来 就可以绑定点击事件了
            // 使用箭头函数的原因是因为箭头函数中无this 所以this才会指向函数的调用者
            this.modalBox.querySelector('i').addEventListener('click', () => {
                // 这个地方需要用到箭头函数
                // 这个this指向 实例对象  调用close方法进行移除
                this.close()
            })
        }
        // 测试一下 点击删除按钮
        document.querySelector('#delete').addEventListener('click', () => {
            // 先调用modal构造函数
            const del = new Modal('温馨的提示', '您没有权限删除操作')
            // 实例对象调用open方法
            //使用原型链的原理:Modal.prototype 上定义了一个 open 方法。这意味着 open 方法是 Modal 构造函数的原型方法,并且会被所有通过 Modal 构造函数创建的实例所共享。 当调用 del.open() 时,JS引擎首先会查看 del 实例自身是否有一个名为 open 的方法。由于 open 方法是定义在原型上的,而不是直接定义在实例上的,所以引擎会在 del 实例的原型链上查找这个方法
            del.open()
        })
        // 测试一下 点击登录按钮
        document.querySelector('#login').addEventListener('click', () => {
            //先调用Modal构造函数
            const login = new Modal('友情的提示', '您没有注册呢')
            //实例对象调用open方法
            login.open()
        })
        // 测试一下 点击新增按钮
        document.querySelector('#add').addEventListener('click', () => {
            //先调用Modal构造函数
            const add = new Modal('提示', '您没有新增权限呢')
            //实例对象调用open方法
            add.open()
        })
        // 3.给构造函数原型对象挂载close方法
        Modal.prototype.close = function () {
            this.modalBox.remove()
        }
    </script>

完整代码设计

<!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>面向对象封装消息提示</title>
    <style>
        .modal {
            width: 300px;
            min-height: 100px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
            border-radius: 4px;
            position: fixed;
            z-index: 999;
            left: 50%;
            top: 50%;
            transform: translate3d(-50%, -50%, 0);
            background-color: #fff;
        }

        .modal .header {
            line-height: 40px;
            padding: 0 10px;
            position: relative;
            font-size: 20px;
        }

        .modal .header i {
            font-style: normal;
            color: #999;
            position: absolute;
            right: 15px;
            top: -2px;
            cursor: pointer;
        }

        .modal .body {
            text-align: center;
            padding: 10px;
        }

        .modal .footer {
            display: flex;
            justify-content: flex-end;
            padding: 10px;
        }

        .modal .footer a {
            padding: 3px 8px;
            background: #ccc;
            text-decoration: none;
            color: #fff;
            border-radius: 2px;
            margin-right: 10px;
            font-size: 14px;
        }
.modal .footer a.submit {
            background-color: #369;
        }
    </style>
</head>

<body>
    <button id="delete">删除</button>
    <button id="login">登录</button>
    <button id="add">新增</button>
    <!-- <div class="modal">
    <div class="header">温馨提示 <i>x</i></div>
    <div class="body">您没有删除权限操作</div>
  </div> -->
    <script>
        // 1.modal构造函数封装——模态框
        function Modal (title = '', message = '') {
            console.log(title, message)
            //创建modal模态框盒子
            // 1.1 创建div标签
            // 因为是构造函数 所以使用this  this经过new 谁new谁是实例对象  两个不同的盒子 this指向当前的盒子
            this.modalBox = document.createElement('div')
            // 1.2 给div标签添加类名为modal
            this.modalBox.className = 'modal'
            // 1.3  modal盒子内部填充 2个div标签并且修改文字内容
            this.modalBox.innerHTML = `
    <div class="header">${title} <i>x</i></div>
    <div class="body">${message}</div>`
            console.log(this.modalBox)
        }
        // new Modal('温馨提示', '您没有权限删除操作')
        // new Modal('友情提示', '您还没登录呢')
        //  当我们打印函数时,想要知道里面的属性使用dir
        // console.dir(Modal)
        // 2.给构造函数原型对象挂载open方法  this指向函数的调用者 函数的调用者是实例对象
        Modal.prototype.open = function () {
            console.log(this)
            // 先判断页面中有没有modal盒子 有就移除  没有就添加
            const box = document.querySelector('.modal')
            // 逻辑与中断  如果有 就执行remove  没有就执行中断这条语句 继续执行下面的语句
            box && box.remove()
            //注意这个方法不要用箭头函数
            //把刚才创建的modalBox显示到页面body中
            document.body.append(this.modalBox)
            // 要等着盒子显示出来 就可以绑定点击事件了
            // 使用箭头函数的原因是因为箭头函数中无this 所以this才会指向函数的调用者
            this.modalBox.querySelector('i').addEventListener('click', () => {
                // 这个地方需要用到箭头函数
                // 这个this指向 实例对象  调用close方法进行移除
                this.close()
            })
        }
        // 测试一下 点击删除按钮
        document.querySelector('#delete').addEventListener('click', () => {
            // 先调用modal构造函数
            const del = new Modal('温馨的提示', '您没有权限删除操作')
            // 实例对象调用open方法
            //使用原型链的原理:Modal.prototype 上定义了一个 open 方法。这意味着 open 方法是 Modal 构造函数的原型方法,并且会被所有通过 Modal 构造函数创建的实例所共享。 当调用 del.open() 时,JS引擎首先会查看 del 实例自身是否有一个名为 open 的方法。由于 open 方法是定义在原型上的,而不是直接定义在实例上的,所以引擎会在 del 实例的原型链上查找这个方法
            del.open()
        })
        // 测试一下 点击登录按钮
        document.querySelector('#login').addEventListener('click', () => {
            //先调用Modal构造函数
            const login = new Modal('友情的提示', '您没有注册呢')
            //实例对象调用open方法
            login.open()
        })
        // 测试一下 点击新增按钮
        document.querySelector('#add').addEventListener('click', () => {
            //先调用Modal构造函数
            const add = new Modal('提示', '您没有新增权限呢')
            //实例对象调用open方法
            add.open()
        })
        // 3.给构造函数原型对象挂载close方法
        Modal.prototype.close = function () {
            this.modalBox.remove()
        }
    </script>
</body>
</html>

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

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

相关文章

模拟笔试 - 卡码网周赛第十八期(23年科大讯飞提前批笔试真题)

第一题&#xff1a; 参考思路解析&#xff1a;&#xff08;遍历nums中的每个数字&#xff0c;得到不为0的数位即可。&#xff09; 1.导入Scanner类&#xff1a; import java.util.Scanner;&#xff1a;引入 Scanner 类&#xff0c;用于读取用户输入。 2.主方法&#xff1a; …

力扣1809 没有广告的剧集(postgresql)

需求 Table: Playback ----------------- | Column Name | Type | ----------------- | session_id | int | | customer_id | int | | start_time | int | | end_time | int | ----------------- 该表主键为&#xff1a;session_id &#xff08;剧集id&#xff09; customer_…

【C++算法】BFS解决FloodFill算法相关经典算法题

1.图像渲染 我们这道题可以使用深搜来解决&#xff0c;利用一个队列遍历到与该点相连的所有像素相同的点&#xff0c;然后将其修改成指定的像素即可&#xff0c;直接上思路&#xff1a; 直接上代码&#xff1a; class Solution {int dx[4] {0, 0, 1, -1};int dy[4] {1, -1, …

计组期末必考大题

一.寻址方式详解 1.直接寻址 指令地址码直接给到操作数所在的存储单元地址 2.间接寻址 A为操作数EA的地址 3.寄存寻址 4.寄存器间接寻址 5.变址寻址 6.基地址寻址 7.小结 二、指令周期详解 一、基本概念 指令周期:去除指令并执行指令所需要的时间指令周期:由若干个CPU周…

go语言的一些常见踩坑问题

开始之前&#xff0c;介绍一下​最近很火的开源技术&#xff0c;低代码。 作为一种软件开发技术逐渐进入了人们的视角里&#xff0c;它利用自身独特的优势占领市场一角——让使用者可以通过可视化的方式&#xff0c;以更少的编码&#xff0c;更快速地构建和交付应用软件&#…

docker 安装minio 服务 ssl 证书

minio 安装 ssl 证书 下载apache 证书 &#xff08;可以使用免费的证书&#xff09; 放在/opt/minio/conf/certs 下 (安装minio 时的 挂载目录 参考文章 docker 安装minio,详细图解 ) 拷贝进容器 /root/.minio docker cp /opt/minio/conf/certs/private.key minio:/root/.mi…

蜂窝物联四情监测:助力农业升级,科技赋能打造丰收新篇章!

农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机&#xff0c;可实时监测基地状况,可以提高监测的效率和准确性&#xff0c;为农业生产提供及时、科学的数据支持&#xff…

知识图谱数据预处理笔记

知识图谱数据预处理笔记 0. 引言1. 笔记1-1. \的转义1-2. 特殊符号的清理1-3. 检查结尾是否正常1-4. 检查<>是否存在1-5. 两端空格的清理1-6. 检查object内容长时是否以<开始 0. 引言 最近学习知识图谱&#xff0c;发现数据有很多问题&#xff0c;这篇笔记记录遇到的…

【android 9】【input】【2.结构体含义】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…

怎么认识和应用Redis内部数据结构?no.22

Redis 内部数据结构 RdeisDb Redis 中所有数据都保存在 DB 中&#xff0c;一个 Redis 默认最多支持 16 个 DB。Redis 中的每个 DB 都对应一个 redisDb 结构&#xff0c;即每个 Redis 实例&#xff0c;默认有 16 个 redisDb。用户访问时&#xff0c;默认使用的是 0 号 DB&#…

NLP(18)--大模型发展(2)

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 LLM的结构变化&#xff1a; Muti-head 共享&#xff1a; Q继续切割为muti-head,但是K,V少切&#xff0c;比如切为2个&#xff0c;然后复制到n个muti-head减少参数量&#xff0c;加速训练 attention结构改动&#xff1a; s…

数据安全保护的权益有什么?

针对个人主体&#xff0c;数据需要保护的权益有&#xff1a; 个人的隐私安全、社交安全、财产安全、支付安全、各类权利安全、生命安全、声誉安全 这些权益在物理世界中也基本都是存在的&#xff0c;只不过在数字世界中进行了映射或者重构。 针对企业的主体&#xff0c;需要保…

非常简单的副业兼职,知乎问答。每天半小时,收益240+

近期平台陆续为我带来了约240元的收入。实现这一目标并不需要复杂的方法或技巧&#xff0c;甚至可以说是零粉丝、零门槛。只需每天抽出半小时进行复制粘贴操作即可。在此&#xff0c;我希望能为那些缺乏基础的小伙伴们提供一些微不足道的经验和启示。 周周近财&#xff1a;让网…

(六)DockerCompose安装与配置

DockerCompose简介 Compose 项目是 Docker 官方的开源项目&#xff0c;负责实现对 Docker 容器集群的快速编排。使用前面介绍的Dockerfile我们很容易定义一个单独的应用容器。然而在日常开发工作中&#xff0c;经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现…

HQL面试题练习 —— 互相关注

目录 1 题目2 建表语句3 题解 1 题目 现有用户关注者列表记录表 t_user_follower&#xff0c;有两个字段&#xff0c;用户ID&#xff08;user_id&#xff09;&#xff0c;关注者列表&#xff08;follower_ids)&#xff0c;关注者列表中是关注用户的用户ID&#xff0c;数据样例如…

JavaEE-文件IO1

文章目录 一、什么是文件IO?1.1 IO1.2 文件1.2.1 路径1.2.2 文件分类 二、使用Java针对文件系统进行操作 一、什么是文件IO? 1.1 IO IO分别代表Input和Output即输入和输出。比如我的电脑可以从网络上下载文件&#xff0c;也可以通过网络上传文件或者我把我的内存中的数据保…

第 8 章 机器人实体导航实现01_准备工作(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 9.3.1 导航实现01_准备工作 1.1分布式架构 分布式架构搭建完毕且能正常运行&#xff0c;在PC端可以远程登陆…

性能测试——性能问题分析步骤

前言 性能测试大致分以下几个步骤&#xff1a; 需求分析 脚本准备 测试执行 结果整理 问题分析 今天要说的是最后一个步骤——“问题分析”&#xff1b; 需求描述 有一个服务&#xff0c;启动时会加载一个1G的词表文件到内存&#xff0c;请求来了之后&#xff0c;会把…

【前端】使用 Canvas 实现贪吃蛇小游戏

使用 Canvas 实现贪吃蛇小游戏 在这篇博客中&#xff0c;我们将介绍如何使用 HTML5 Canvas 和 JavaScript 实现一个简单的贪吃蛇&#xff08;Snake&#xff09;小游戏。这个项目是一个基础的游戏开发练习&#xff0c;它可以帮助你理解如何在 Canvas 上绘图、如何处理用户输入以…

【Spring security】【pig】Note03-pig token令牌解析器过程

&#x1f338;&#x1f338; pig token令牌解析器过程 &#x1f338;&#x1f338; pig后端源码 一、解析请求中的令牌值。 二、验证令牌 内省并验证给定的令牌&#xff0c;返回其属性。返回映射表示令牌有效。 /*** author lengleng* date 2019/2/1 扩展用户信息*/ publi…