Javascript:Class构造函数

news2025/2/28 3:16:27

为什么需要class

在其他语言中class已经是一个早就被实现的功能,在JavaScript中一直到ES6被实现。在class没有实现之前我们是这样写的(如下代码)

function Person(name,sex){this.name = ''this.sex='
}
Person.prototype.say=function(){alert('hello')
} 

有了class我们就这么写的,是不是看起来更简洁。甚至对于初学者来说都不需要了解什么是prototype

class Person {constructor (name,sex) {this.name = name;this.sex = sex;}say() {alert('hello')}
} 

个人认为的是:在没有class这个声明之前,可以使用es5来模拟。但是在一定程度上并不是规范。如果新手或者通过其他语言学习者看到这个prototype什么的就比较懵。有了这个class关键字让js做面向对象的设计更完善了

class是什么

定义:类关键字Class 和 constructor 构造函数

类是用于创建对象的模板。 用 class 关键字来创建一个类,类体在一对大括号 {} 中,我们可以在大括号 {} 中定义类成员的位置,如方法或构造函数。 每个类中包含了一个特殊的方法 constructor(),它是类的构造函数,这种方法用于创建和初始化一个由 class 创建的对象。

class ClassName {constructor() { ... } 
}
//定义好类后,我们就可以使用 new 关键字来创建对象:
let site = new ClassName(); 

创建对象时会自动调用构造函数方法 constructor()。还可以这样创建对象

// 未命名/匿名类
let Runoob = class {constructor(name, url) {this.name = name;this.url = url;}
};
console.log(Runoob.name);
// output: "Runoob"
 
// 命名类
let Runoob = class Runoob2 {constructor(name, url) {this.name = name;this.url = url;}
};
console.log(Runoob.name);
// 输出: "Runoob2"

// 自执行的类
let Runoob =new class {constructor(name, url) {this.name = name;this.url = url;}
}('name','111');
console.log(Runoob) 

constructor 构造方法

构造方法是一种特殊的方法:

  • 构造方法名为 constructor()。
  • 构造方法在创建新对象时会自动执行。
  • 构造方法用于初始化对象属性。
  • 如果不定义构造方法,JavaScript 会自动添加一个空的构造方法。

static 静态方法

类(class)通过static关键字定义静态方法。

静态方法调用直接在类上进行,不能在类的实例上调用。但是父类的静态属性和静态方法,会被子类继承

静态方法通常用于创建实用程序函数。

class A {static foo = 100;static hello() {console.log('hello world');console.log(A.foo)}
}
A.hello()
const a=new A(); // typeError: a.hello is not a function
a.hello()
class B extends A {
}

B.hello()// hello world 

注意,静态属性是通过软拷贝实现继承的。

class A { static foo = 100; }
class B extends A {constructor() {super();B.foo--;}
}

const b = new B();
B.foo // 99
A.foo // 100 

上面示例中,foo是 A 类的静态属性,B 类继承了 A 类,因此也继承了这个属性。但是,在 B 类内部操作B.foo这个静态属性,影响不到A.foo,原因就是 B 类继承静态属性时,会采用浅拷贝,拷贝父类静态属性的值,因此A.fooB.foo是两个彼此独立的属性。

但是,由于这种拷贝是浅拷贝,如果父类的静态属性的值是一个对象,那么子类的静态属性也会指向这个对象,因为浅拷贝只会拷贝对象的内存地址。

class A {static foo = { n: 100 };
}

class B extends A {constructor() {super();B.foo.n--;}
}

const b = new B();
B.foo.n // 99
A.foo.n // 99 

上面示例中,A.foo的值是一个对象,浅拷贝导致B.fooA.foo指向同一个对象。所以,子类B修改这个对象的属性值,会影响到父类A

私有方法和属性

目前 class 的私有属性特性已经进入了 Stage3 实验阶段,通过 Babel 已经可以使用,并且 Node v12,chrome 中也增加了对私有属性的支持,但这并不妨碍我们用 JS 的现有功能实现一个私有属性特性,以加深对这一概念的理解。

 class Person {_count = 100// 私有属性外部不可直接设置值,直接访问// 变量污染,不能设置同名属性#userName#user_Name; // 实例上的私有属性,不能直接修改值,不能遍历static #userName; // 类的静态私有属性,不可继承,无法直接修改,只能通过类内部方法修改static names = []get value() {return this._count}set value(num) {this._count = num}constructor(name) {this.name = namethis.#user_Name = namePerson.#userName = '1111'Person.names.push(name)}userName() {console.log(Person.#userName)console.log(this.#user_Name)}setUserName(name) {Person.#userName = namethis.#user_Name = namePerson.names.push(name)}sayHi() {console.log(`我是可以直接设置的名字${this.name}`)}}//const myPerson = new Person('用户1')// Object.setPrototypeOf(myPerson,null)myPerson.sayHi()console.log('Person', myPerson)const myPerson2 = new Person('用户2')// Object.setPrototypeOf(myPerson,null)myPerson2.sayHi()console.log('Person', myPerson2) 
  • 私有属性外部不可直接设置值,直接访问
  • 变量污染,不能设置同名属性 #userName
  • #user_Name; // 实例上的私有属性,不能直接修改值,不能遍历
  • static #userName; // 类的静态私有属性,不可继承,无法直接修改,只能通过类内部方法修改

继承extends和super

  • 关键字用于创建一个类,该类是另一个类的子类。
  • 子类继承了另一个类的所有方法。
  • 继承对于代码可重用性很有用:在创建新类时重用现有类的属性和方法。
  • super() 方法引用父类的构造方法。
  • 通过在构造方法中调用 super() 方法,我们调用了父类的构造方法,这样就可以访问父类的属性和方法。
class childClass extends parentClass 

super 关键字用于访问和调用一个对象的父对象上的函数。。

在构造函数中使用时,super关键字将单独出现,并且必须在使用 this 关键字之前使用。super 关键字也可以用来调用父对象上的函数。

第一种情况,super作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次super函数。

class A {}

class B extends A {constructor() {super();}
} 

第二种情况,super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。

class A {p() {return 2;}
}

class B extends A {constructor() {super();console.log(super.p()); // 2}
}

let b = new B(); 

使用的时候注意事项

1.只能new使用,不能作为方法直接调用会报错
2.this调用的是时指向
3.类方法不可枚举

和ES5的区别和相同点

1.与 ES5 不同,类不存在变量提升
2.类的调用必须要使用 new 命令,否则会报错
3.底层还是ES5原型链实现(可称作语法糖)
4.实例的__proto__ 指向 类的prototype

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

金融类的APP该如何进行ASA推广

移动理财成为新金融的主流,在如今,金融机构都在争相推出自己的移动理财产品,那今天柚鸥ASO就来给大家讲一下,金融类的APP在进行ASA前的一些注意事项。 APP进行ASA前的开户有两种: 自主开户(1,…

检测物理内存容量

文章目录前言前置知识BIOS 中断 0x15 子功能 0xe820 获取内存代码说明实验操作前言 本博客记录《操作系统真象还原》第五章实验操作~ 实验环境:ubuntu18.04VMware , Bochs下载安装 实验内容:三种检测内存的方法。 实验原理: …

volaile关键字详解!

文章目录什么是volatile ?volatile三大特性volatile如何使用volatile保证可见性volatile不保证原子性volatile禁止指令重排volatile总结什么是volatile ? volatile是一个Java关键字volatile是Java虚拟机提供的轻量级的同步机制 volatile三大特性 保证…

【服务器搭建个人网站】教程五:手把手教你怎样进行公安备案 快来学~

前言 购买一台服务器,再来个域名,搭建一个自己的个人博客网站,把一些教程、源码、想要分享的好玩的放到网站上,供小伙伴学习玩耍使用。我把这个过程记录下来,想要尝试的小伙伴,可以按照步骤,自己…

【Qt】将QtDesigner生成的.ui文件转化为.h头文件

【Qt】将QtDesigner生成的.ui文件转化为.h头文件1、背景2、实例3、附件1、背景 操作系统:windows10专业版。 Qt版本:qt-opensource-windows-x86-msvc2013_64-5.7.1.exe 博主的Qt安装目录:E:\E01_cppIDE\E01_qt\install 并将安装后的bin目录…

校园wifi网页认证登录入口

一、校园WIFI自助服务简介在我校校园网认证业务中,教职工校园通行证账号支持最大3个终端同时在线,如果超出最大在线数,最后上线的终端会把第一个上线的终端踢下线,导致终端经常掉线,需要重新登录才可上网。那么&#x…

【Linux】基础:基础IO

【Linux】基础:基础IO 摘要:本文基础IO的内容将从过往熟悉的C语言文件操作出发,引申指系统调用的文件操作,再进一步深化为对于进程管理的文件进行介绍,从而了解文件描述符的概念和管理方式,其中还会介绍其运…

2022 IoTDB Summit:京东刘刚《Apache IoTDB 在京东万物互联场景中的应用》

12 月 3 日、4日,2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本,并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例,深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

基于JavaSpringMvc+mybatis实现学生信息管理系统

基于JavaSpringMvcmybatis实现学生信息管理系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

IOS Theos Tweak 之 HelloWorld

一、目标 Theos是什么? 是一套跨平台的开发工具套件,不仅可以开发Ios,Mac、Windows和Linux也可以的哦,开源免费。 Tweak是什么? 可以理解成动态链接库,有搞过Windows下dll注入的同学应该可以秒懂了。Android的同学…

JavaWeb——redis_1/6

链接: day23_redis_代码&资料 提取码:ijyg 今日内容redis——数据库软件1. 概念2. 下载安装3. 命令操作1. redis的数据结构2. 字符串类型 string3. 哈希类型 hash4. 列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部&#xff0…

硬件工程师成长之路(0)----认识元件

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言1、电阻①、贴片电阻②、金属膜电阻③、水泥电阻④、制动电阻⑤、电位器⑥、压敏电阻⑦、热敏电阻⑧、光敏电阻⑨、…

奇舞周刊478期:算法工程师深度解构 ChatGPT 技术

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■算法工程师深度解构 ChatGPT 技术本文用专业视野带你由浅入深了解 ChatGPT 技术全貌。它经历了什么训练过程?成功关键技术是什么?将如何带动行业的变革&#xf…

Spark学习(8)-SparkSQL的运行流程,Spark On Hive

1. SparkSQL的运行流程 1.1 SparkRDD的执行流程回顾 1.2 SparkSQL的自动优化 RDD的运行会完全按照开发者的代码执行, 如果开发者水平有限,RDD的执行效率也会受到影响。而SparkSQL会对写完的代码,执行“自动优化”, 以提升代码运…

In-Context Learning玩法大全

卷友们好,我是rumor。虽然ChatGPT在大众眼里的热度可能已经过去了,但它prompt出了我的焦虑,于是最近一直在补大模型相关的工作。比起小模型,大模型有一个很重要的涌现能力(Emergent ability)就是In-Context…

CORS 跨域资源共享 与 JSONP

CORS 1、接口的跨域问题 我们使用express编写的 GET 和 POST接口,存在一个很严重的问题:不支持跨域请求。 解决接口跨域问题的方案主要有两种: CORS(主流的解决方案,推荐使用)JSONP(有缺陷的…

excel查重技巧:如何用组合函数快速统计重复数据(下)

数据源照旧,如下图所示,要求统计出不重复的客户数:在上期我们掌握了破解公式的方法后,今天我们再来看看计算不重复数据个数的第二个公式套路。套路2:COUNT和MATCH的组合这个公式的难度就稍微有点大了,一起看…

Word控件Spire.Doc 【Table】教程(3):如何在C#、VB.NET中设置Word表格样式

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

聊聊帮助别人这件事--爱摸鱼的美工(12)

年近了,上班途中依然匆忙 看女孩子们渐渐开始倒腾 做了新发型,做了美美的指甲 换上了新衣服,买了新包 电话里讨论着 去哪里过年,买什么年货 好像以前的我也这样 今年挣得少了,不想添新衣(不能) …

基于QWidget和QImage的水印添加实现

目录 1. 基于QWidget的屏幕阅读水印的添加 1.1 平铺 1.1.1 核心代码 1.1.2 构造函数中设置透明度和鼠标穿透 1.1.3 调用 1.1.4 效果展示 1.2 指定位置添加水印 1.2.1 核心代码 1.2.2 设置水印透明度和鼠标穿透 1.2.3 调用 1.2.4 效果展示 2、基于QImage的屏幕水印的…