JS — 类、事件

news/2025/1/20 1:03:25/文章来源:https://www.cnblogs.com/kitty-38/p/18680607

  • 与C++中的Class类似。但是不存在私有成员(全都是公开的)。

  • this指向类的实例。

  • 类名一般使用驼峰命名法。


定义:

class 类名 {  // 定义一个类constructor() {  // 构造函数(如果不写构造函数,会默认有一个无参构造函数)}
}

例如:
test.js中的内容为:

class Point {  // 定义一个类叫Pointconstructor(x, y) {  // 构造函数(如果不写构造函数,会默认有一个无参构造函数)this.x = x;  // 定义成员变量this.y = y;}init() {  // 定义成员函数this.sum = this.x + this.y;  // 成员变量可以在任意的成员函数中定义}toString() {  // 定义成员函数//return '(' + this.x + ',' + this.y + ')';return `(${this.x}, ${this.y})`;}
}let main = function() {let p = new Point(3, 4);  // 实例console.log(p.x, p.y);  // 返回3,4console.log(p.toString());  //返回(3, 4)
}export {main
}

test.html中的内容为:

<body><script type="module">import {main} from "/test/test.js";main();</script></body>

ps:每一个class都可以对应前端的每一个组件,可以用class去维护每一个组件的各种行为等。


继承:

test.js中的内容为:

class Point {  // 定义一个类叫Pointconstructor(x, y) {  // 构造函数(如果不写构造函数,会默认有一个无参构造函数)this.x = x;  // 定义成员变量this.y = y;}toString() {  // 定义成员函数//return '(' + this.x + ',' + this.y + ')';return `(${this.x}, ${this.y})`;}
}class ColorPoint extends Point {  // extends:继承constructor(x, y, color) {super(x, y);  // 这里的super是指基类(父类)的构造函数,先进行初始化this.color = color;}toString() {return `${this.color} ${super.toString()}`;}
}let main = function() {let p = new ColorPoint(3, 4, 'pink');  // 实例console.log(p.toString());  // 返回pink (3, 4)
}export {main
}

test.html中的内容为:

<body><script type="module">import {main} from "/test/test.js";main();</script></body>

ps:

  • super这个关键字,既可以当作函数使用,也可以当作对象使用。

  • 作为函数调用时,代表父类的构造函数,且只能用在子类的构造函数之中。

  • super作为对象时,指向父类的原型对象。

  • 在子类的构造函数中,只有调用super之后,才可以使用this关键字。

  • 成员重名时,子类的成员会覆盖父类的成员。类似于C++中的多态(同一个函数可以表现出多种不同的状态)。


静态方法:

  • 在成员函数前添加static关键字即可。

  • 静态方法不会被类的实例继承,所以只能通过类来调用,通过“类名 . 函数名”来访问。

  • 静态函数是所有实例公共的函数(相当于全局变量)。

例如:
test.js中的内容为:

class Point {  // 定义一个类叫Pointconstructor(x, y) {  // 构造函数(如果不写构造函数,会默认有一个无参构造函数)this.x = x;  // 定义成员变量this.y = y;}toString() {  // 定义成员函数//return '(' + this.x + ',' + this.y + ')';return `(${this.x}, ${this.y})`;}static print_class_name() {console.log("Point");}
}let main = function() {let p = new Point(3, 4);  // 初始化实例(非静态的成员变量和成员函数)Point.print_class_name();  // 通过类名访问静态函数,返回Pointp.print_class_name();  // 会报错
}export {main
}

test.html中的内容为:

<body><script type="module">import {main} from "/test/test.js";main();</script></body>

静态变量:

  • 在ES6中,只能通过class.propname定义和访问,静态成员必须通过类本身来访问。

  • 静态变量是所有实例公共的变量(相当于全局变量)。

例如:
test.js中的内容为:

class Point {  // 定义一个类叫Pointconstructor(x, y) {  // 构造函数(如果不写构造函数,会默认有一个无参构造函数)this.x = x;  // 定义成员变量this.y = y;Point.cnt++;}toString() {  // 定义成员函数//return '(' + this.x + ',' + this.y + ')';return `(${this.x}, ${this.y})`;}static print_class_name() {console.log("Point");}
}Point.cnt = 0;  // 定义Point的静态成员变量cntlet main = function() {// 初始化五个点for (let i = 0; i < 5; i++) {  new Point(3, 4);}console.log(Point.cnt);  // 返回5
}export {main
}

test.html中的内容为:

<body><script type="module">import {main} from "/test/test.js";main();</script></body>

事件

  • JavaScript的代码一般通过 事件 触发。

  • 可以通过addEventListener函数(常用API)为元素绑定事件的触发函数。

例如:
test.js中的内容为:

let div = document.querySelector('div');  // 获取文档中id="div" 的元素。querySelector() 方法返回文档中匹配指定CSS选择器的一个元素。
let input = document.querySelector('input');let main = function() {div.addEventListener('click', function(event) {  // 鼠标左键点击事件console.log(event.type);  // 返回事件的类型,每点击一次输出一次});input.addEventListener('input', function(event) {  // 键盘输入事件console.log(event.type);  // 返回事件的类型,连续触发});input.addEventListener('focus', function(event) {  // 聚焦事件console.log(event.type);  // 返回事件的类型});window.addEventListener('resize', function(e) {console.log(e.type);}) }export {main
}

test.html中的内容为:

<body><div></div><input type="text"><script type="module">import {main} from "/test/test.js";main();</script></body>

test.css中的内容为:

div {width: 300px;height: 300px;background-color: pink;
}

常见的触发函数有:

鼠标

  • click:鼠标左键点击

  • dblclick:鼠标左键双击

  • contextmenu:鼠标右键点击

  • mouseup:鼠标弹起,包括左键、滚轮、右键

  • mousedown:鼠标按下,包括左键、滚轮、右键

  • event.button:0表示左键,1表示中键,2表示右键


键盘

  • keyup:某个按键是否被释放

  • keydown:某个键是否被按住,事件会连续触发

  • keypress:紧跟在keydown事件后触发,只有按下字符键时触发。适用于判定用户输入的字符。

  • keydown、keyup、keypress的关系类似于鼠标的mousedown、mouseup、click

  • event.code:返回按的是哪个键

  • event.altKey、event.ctrlKey、event.shiftKey分别表示是否同时按下了alt、ctrl、shift键。

  • event常用属性同上


表单

  • focus:聚焦某个元素

  • blur:取消聚焦某个元素

  • change:某个元素的内容发生了改变


窗口

需要作用到window元素上。

  • resize:当窗口大小发生变化

  • scroll:滚动指定的元素

  • load:当元素被加载完成


库函数和API的区别:

库函数顾名思义就是把函数放到库里,是把一些常用的函数编完放到一个文件里,供别人用。库函数调用通常用于应用程序中对一般文件的访问。主要由两方面提供:一是操作系统提供的;另一类是由第三方提供的。

API(Application Programming Interface)是应用程序编程接口。windows不允许应用程序直接访问硬件,但是会提供API函数让用户间接地访问,这样就会调用系统级API。API分为两种:一是用户级API,替用户写好函数,方便调用;二是系统级API,如果应用程序想要和硬件交互,必须调用此类函数。程序员调用的是API(api函数),然后通过与系统调用共同完成函数的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【clang-format】C++代码风格自用配置文件,大括号换行风格

使用方法: 新建一个文本文件,把下面代码复制进去,再把名字改成.clang-format,然后粘贴到项目文件夹的根目录下即可,效果如下图。当然,IDE需要设置启用clang-format。clang-format文件内容 # LLVM Google BasedOnStyle: Google Language: Cpp# 强制花括号遵循 Allman 风格…

【clang-format】vscodeC++调整代码格式时让public顶格

习惯了leetcode里面public顶格写,vscode格式化代码public不顶格看着难受。 如图:只要在.clang-format文件中添加下面这行就行 # 访问修饰符偏移 AccessModifierOffset: -4 # -4就是public顶格如果是用vscode插件配置的: "C_Cpp.clang_format_style": "{Base…

基于反射实现的零GC高效率Unity组件绑定

前言 我是狗猥,上一世,我使用传统方式绑定UI上的组件,却因xLua扩展代码太多撑爆丹田沦为废人,失去了争夺主程岗位的资格,最后在测试同学的讥笑声中饮恨西北。 再次睁开眼,我穿越回到了拼UI的那一天。重生归来,这一世我要设计一个船新的绑定方式,夺回本就属于我的一切!…

XML+propties

txt文件,properties(属性)文件,XMl文件txt与properties与XML的区别当这些文件存储单个关系数据时, 普通文件 无法存储 关系数据,而properties属性文件以键值对形式存储就很方便,XML文件也可以 见图1 但储存多个用户就不行了,XML更适合, 见图2properties集合properties …

一条SQL更新语句是如何执行的?

与查询流程不同的是,更新流程中会涉及两个重要的模块: (i)redo_log模块(InnoDB中的日志模块):在 MySQL 里也有这么个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高。为了解决这个问题,MyS…

大模型分布式训练并行技术(五)-序列并行

p { font-size: 12pt; line-height: 2 !important } 参考资料 大模型分布式训练并行技术(五)-序列并行 详解MegatronLM序列模型并行训练(Sequence Parallel)一、序列并行(Colossal-AI)背景 Colossal-AI 序列并行诞生的背景是 self-attention 的内存需求是输入长度(sequenc…

1.匿名内部类

使用场景不用多创建类,来使用其方法定义 匿名内部类的语法比较奇特,匿名内部类既是一个类的定义,同时他本身也是一个对象, 所以子类继承抽象类, 实现类实现接口,需要节省内存不创建类,从而创建匿名内部类 例子使用当你的才华配不上你的野心,努力的时候到了!

Arrays 排序

正常来说 Arrays可以用于数组排序, 但如果数组里面是引用类型地址就会报错,这时候, 就需要加个功能(实现接口/继承接口) Comparable接口来定引用类型对象的排序规则(以..属性值进行排序)正常Arrays.sort( 数组对象)进行排序时 , 会在排序的时候将数组对象进行调用comparato方…

Spring Boot 自动配置原理详解

引言 Spring Boot 的一大亮点是它能够自动配置(Auto-Configuration)Spring应用程序,极大地简化了Spring应用的创建过程。开发者只需添加所需的依赖,Spring Boot就会根据这些依赖和一些预设条件自动装配相应的组件,从而减少了大量样板代码的编写。 第三方组件的集成方式 对…

传奇

毋庸置疑,很多人的心里,都有一个传奇、传奇3,80后、90后,甚至70后尤甚。当然也包括我。主要当然因我曾经是盛大游戏传奇工作室研发团队的一员,且是盛大传奇3项目部的第一个程序技术人员,内心对传奇、传奇3的感情非同一般。因工作等原因,我早已不再从事传奇类游戏的开发研…

常用工具

类似gdb的bash调试工具bashdb: https://sourceforge.net/projects/bashdb/files/bashdb/ 非常好用,结合vscode bashdb(bash debug) shift + command + d,配置 .vscode/launch.json

《CPython Internals》阅读笔记:p232-p249

《CPython Internals》学习第 13天,p232-p249 总结,总计 18 页。 一、技术总结 无。 二、英语总结(生词:1) 1.overhead (1)overhead: over-("above") + head(“top part, uppermost section”) overhead的字面意思是:above the head,后来演变成"represent …