2025-2-19学习笔记 : this关键字,constructor结构体,class类
1、This关键字
在 JavaScript 中,this 是一个关键字,其指向取决于函数的调用方式。理解 this 的指向对于编写正确的代码至关重要。以下是 this 在不同情况下的指向规则:
1. 全局函数调用
当函数在全局作用域中被调用时,this 指向全局对象。在浏览器中,全局对象是 window。
function test() {console.log(this); // 在浏览器中,输出 window 对象
}
test();
2. 对象方法调用
当函数作为对象的方法被调用时,this 指向该对象。
const obj = {name: 'Alice',greet: function() {console.log(this.name);}
};
obj.greet(); // 输出 'Alice'
3. 构造函数调用
当函数作为构造函数使用时(即使用 new 关键字调用),this 指向新创建的对象。
function Person(name) {this.name = name;
}
const person = new Person('Bob');
console.log(person.name); // 输出 'Bob'
4. call 和 apply 方法调用
call 和 apply 方法可以显式地指定函数内部的 this 指向。
function greet() {console.log(this.name);
}
const person = { name: 'Charlie' };
greet.call(person); // 输出 'Charlie'
greet.apply(person); // 输出 'Charlie'
5. 箭头函数
箭头函数与普通函数不同,它没有自己的 this,而是继承自外部函数的 this。
function Outer() {this.name = 'David';setTimeout(() => {console.log(this.name); // 输出 'David'}, 1000);
}
new Outer();
在上述示例中,箭头函数内部的 this 继承自 Outer 函数的 this,因此输出 'David'。
6. 事件处理器中的 this
在事件处理器中,this 通常指向触发事件的 DOM 元素。
const button = document.querySelector('button');
button.addEventListener('click', function() {console.log(this); // 输出触发事件的 button 元素
});
需要注意的是,箭头函数在事件处理器中也会继承外部的 this,这可能导致与预期不符的行为。
理解 this 的指向规则对于编写正确的 JavaScript 代码至关重要。
2、constructor
在 JavaScript 中,constructor 是一个特殊的方法,用于创建和初始化由类创建的对象。每个类都可以有一个名为 constructor 的方法,当使用 new 关键字创建类的实例时,constructor 方法会被自动调用。citeturn0search0
构造函数的基本用法:
class Person {constructor(name, age) {this.name = name;this.age = age;}
}const person1 = new Person('Alice', 30);
console.log(person1.name); // 输出: Alice
console.log(person1.age); // 输出: 30
在上述示例中:
Person类包含一个constructor方法,用于初始化name和age属性。- 使用
new Person('Alice', 30)创建了一个新的Person实例person1,并传递了参数'Alice'和30。 person1的name和age属性被成功初始化。
构造函数的特点:
- 自动调用: 当使用
new关键字创建类的实例时,constructor方法会被自动调用。 - 初始化属性:
constructor方法通常用于初始化实例的属性。 - 只能有一个: 一个类只能有一个名为
constructor的方法。
注意事项:
- 如果类中没有显式定义
constructor方法,JavaScript 会提供一个默认的构造函数。 - 在构造函数中,可以使用
super关键字调用父类的构造函数。
示例:
class Employee extends Person {constructor(name, age, employeeId) {super(name, age); // 调用父类的构造函数this.employeeId = employeeId;}
}const employee = new Employee('Bob', 25, 'E123');
console.log(employee.name); // 输出: Bob
console.log(employee.age); // 输出: 25
console.log(employee.employeeId); // 输出: E123
在上述示例中:
Employee类继承自Person类。Employee的constructor方法首先调用super(name, age),以初始化从Person继承的属性。- 然后,
Employee的constructor方法初始化了employeeId属性。
通过使用 constructor 方法,可以在创建对象时进行必要的初始化操作,确保对象处于有效的状态。
3、
在 JavaScript 中,class 是 ES6 引入的用于创建对象的模板。它为对象提供了状态(成员变量)的初始值和行为(成员函数或方法)的实现。虽然 class 语法看起来类似于传统的面向对象编程语言,但其底层实现仍然基于原型和构造函数。
定义类
使用 class 关键字可以定义一个类。类的主体由一对大括号 {} 包裹,其中可以包含构造函数和方法。
// 类声明
class Rectangle {constructor(height, width) {this.height = height;this.width = width;}// 方法calcArea() {return this.height * this.width;}
}
在上述示例中,Rectangle 类包含一个构造函数 constructor,用于初始化实例的 height 和 width 属性,以及一个方法 calcArea,用于计算矩形的面积。
创建类的实例
可以使用 new 关键字来创建类的实例:
const rect = new Rectangle(10, 5);
console.log(rect.calcArea()); // 输出:50
类的继承
JavaScript 中的类支持继承,可以使用 extends 关键字来创建一个类作为另一类的子类。子类可以继承父类的属性和方法,并可以重写父类的方法。
class Square extends Rectangle {constructor(side) {super(side, side); // 调用父类的构造函数}
}
在上述示例中,Square 类继承自 Rectangle 类,并在构造函数中调用 super 来初始化 height 和 width,使其相等,从而表示正方形。
静态方法和字段
使用 static 关键字可以定义类的静态方法或字段。静态方法和字段属于类本身,而不是类的实例。
class MathUtil {static square(x) {return x * x;}
}console.log(MathUtil.square(5)); // 输出:25
私有字段和方法
ES2022 引入了私有字段和方法的概念,使用 # 前缀来定义私有成员。私有成员只能在类的内部访问,外部无法直接访问。
class Counter {#count = 0;increment() {this.#count++;}getCount() {return this.#count;}
}const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 输出:1
在上述示例中,#count 是一个私有字段,increment 和 getCount 方法用于操作和访问该私有字段。
总结
JavaScript 中的 class 提供了一种更清晰、更接近传统面向对象编程的方式来定义对象和组织代码。它使得代码更加模块化、可复用、可扩展。通过类,可以轻松地创建多个对象实例并管理它们的属性和行为。
相关文章:
2025-2-19学习笔记 : this关键字,constructor结构体,class类
1、This关键字 在 JavaScript 中,this 是一个关键字,其指向取决于函数的调用方式。理解 this 的指向对于编写正确的代码至关重要。以下是 this 在不同情况下的指向规则: 1. 全局函数调用 当函数在全局作用域中被调用时,this 指向…...
避坑:过早的文件结束符(EOF):解决“git clone龙蜥OS源码失败”的失败过程
避坑:过早的文件结束符(EOF):解决“git clone龙蜥OS源码失败”的失败过程 安装Anolis OS 8.9 下载AnolisOS-8.9-x86_64-dvd.iso并安装。 使用uname -a查看内核版本为5.10.134-18.an8.x86_64。 [rootlocalhost cloud-kernel]# c…...
【Quest开发】全身跟踪
软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件:Meta Quest3 最终效果:能像meta的操作室沉浸场景一样根据头盔移动来推断用户姿势,实现走路、蹲下、手势匹配等功能 需要借助UnityMovement这个包 GitHub …...
通过BingAPI爬取Bing半个月内壁纸
通过BingAPI爬取Bing半个月内壁纸 一、前言二、爬虫代码三、代码说明 一、前言 爬取Bing搜索网站首页壁纸的方式主要有两种,第一种为间接爬取,即并不直接对Bing网站发起请求,而是对那些收集汇总了Bing壁纸的网站发起请求,爬取图片…...
Linux升级Anacodna并配置jupyterLab
在使用 Anaconda 的过程中,随着项目和需求的发展,可能需要升级 Anaconda 的 Base 环境中的 Python 版本。本文将详细介绍如何安全地进行升级,包括步骤、代码示例与最终流程图。 升级 Python 一、环境准备 在进行任何升级之前,建…...
ctfshow web入门 web11-web24
web11 web12 进来浏览网站,底部有一串数字,根据提示可能有用,访问robots.txt,发现禁止访问/admin/,进去看看发现需要输入用户名和密码,刚想爆破就猜对了,用户名是admin,密码是页面下…...
Windows 环境下配置多个不同版本的 Maven
在实际开发中,不同的项目可能需要使用不同版本的 Maven。例如,老项目可能依赖于 Maven 3.3,而新项目可能需要 Maven 3.8+ 才能正常运行。因此,在 Windows 下配置多个 Maven 版本并能方便地切换是非常必要的 1. 下载并安装多个 Maven 版本 1.1 下载 Maven 访问 Apache Mav…...
web入侵实战分析-常见web攻击类应急处置实验1
场景说明: 某天运维人员发现在/opt/tomcat8/webapps/test/目录下,多出了一个index_bak.jsp这个文件, 并告诉你如下信息 操作系统:ubuntu-16.04业务:测试站点中间件:tomcat开放端口:22&#x…...
适配器模式 Adapter Pattern
https://en.wikipedia.org/wiki/Adapter_pattern https://www.baeldung.com/java-adapter-pattern 适配器模式(也称为包装器「wrapper」,与装饰器模式「decorator pattern」共享的另一种命名),它允许将现有类的接口用作另一个接…...
Android 动态加入Activity 时 manifest 注册报错解决。使用manifestPlaceholders 占位
需求如下: 项目 测试demo 有多个渠道,部分渠道包含支付功能,在主测试代码外,需要一个单独 Activity 调用测试代码。 MainActivityPayActivity渠道A包含不包含渠道B包含包含 因为支付功能需要引入对应的 moudule,因此…...
芝加哥学派(Chicago School):金融与经济学的创新力量(中英双语)
芝加哥学派:金融与经济学的创新力量 在经济学和金融学的历史上,有一个学派的影响力不容忽视,那就是芝加哥学派(Chicago School)。芝加哥学派不仅在学术界广受推崇,也深刻影响了全球的经济政策和金融市场。…...
3分钟了解内外网文件传输:常见方法、注意事项有哪些?
内外网文件传输不仅是企业日常运营的基础设施,更是支持业务增长、创新和合规的关键工具。通过高效、安全的文件传输,企业能够更好地应对全球化协作、远程办公和数据安全等挑战,从而在竞争激烈的市场中保持领先地位。 一、内外网文件传输的常…...
Python学习心得常用的内置函数
常用的内置函数: 1.数据类型转换函数: 描述说明 描述说明 bool(obj) 获取指定对象 obj 的布尔值 str(obj) 将指定对象 obj 转成字符串类型 int(x) 将 x 转成 int 类型 float(x) 将 x 转成 float 类型 list(sequence) 将序列转成列表类型 tu…...
VMware Workstation16安装Centos7以及静态IP设置
配置虚拟机操作系统 1.创建新的虚拟机 -> 自定义配置,下一步 2. 选择虚拟机硬件兼容性 -> 默认,下一步 3.安装客户机操作系统 -> 稍后安装操作系统,下一步 4.选择客户机操作系统 -> LinuxCentOS7 64 位,下一步 5.命名…...
【核心算法篇十九】《 DeepSeek因果推断:双重差分模型如何破解政策评估的「时空难题」》
一、当AB实验不可行时,我们该相信什么?(因果推断困局解析) 假设某城市推出「夜间地铁免费」政策,市长想知道这个政策是否真的提升了夜间经济。这时候你会发现: 1️⃣ 无法克隆城市:不能同时存在一个「实施政策」和「不实施政策」的平行宇宙 2️⃣ 数据混杂严重:疫情反…...
Token Embedding(词嵌入)和Positional Encoding(位置编码)的矩阵形状关系及转换过程
在从零开始构建一个小型字符级语言模型时,简化的实现步骤是:数据准备→模型架构设计→训练→评估与生成。模型架构设计阶段的流程如下: 图1 模型架构设计阶段的流程 包含了输入层、嵌入层、解码器层和输出层。其中在嵌入层中包括了Token Embedding(词嵌入)和Positional En…...
多个用户如何共用一根网线传输数据
前置知识 一、电信号 网线(如以太网线)中传输的信号主要是 电信号,它携带着数字信息。这些信号用于在计算机和其他网络设备之间传输数据。下面是一些关于网线传输信号的详细信息: 1. 电信号传输 在以太网中,数据是…...
U-Net 与深度学习的完美结合:图像分割的高效解决方案
1. 引言:U-Net背景及应用 1.1 U-Net的起源与发展 U-Net 是由 Olaf Ronneberger 和他的团队于2015年提出的卷积神经网络(CNN)架构。最初的设计目的是解决医学图像分割中的挑战,尤其是在有限的训练数据下如何实现准确的分割。 在…...
nginx ngx_http_module(9) 指令详解
nginx ngx_http_module(9) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_uwsgi_module:uWSGI支持模块,允许Nginx与uWSGI服务器进行通信。uWSGI是一种应用服务器协议,广泛用于Python Web应用的部署。通过该…...
【从0做项目】Java搜索引擎(4)——性能优化~烧脑~~~
本篇文章将对项目搜索引擎(1)~(3)进行性能优化,包括测试,优化思路,优化前后对比 目录 一:文件读取 二:实现多线程制作索引 1:代码分析 2:代码…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
