1. 类的简介
- 类是对象的模板,可以将对象中的属性和方法直接定义在类中,定义后,就可以直接通过类来创建对象。
- 通过同一个类创建的对象,成为同类对象
- 可以用instanceof来检查一个对象是否由某个类创建
- 如果某个对象是由某个类所创建,则我们称该对象是这个类的实例
- 语法:
| class 类名 {} |
| const 类名 = class {} |
2. 类的属性
| class Person { |
| name = "孙悟空"; |
| age = 18; |
| static test = "test静态属性"; |
| } |
3. 类的方法
| class Person { |
| name = "孙悟空"; |
| sayHello(){ |
| console.log("大家好,我是" + this.name); |
| } |
| static test(){ |
| console.log("我是静态方法", this); |
| } |
| } |
| const p1 = new Person(); |
| pa.sayHello(); |
| Person.test(); |
4. 类的构造函数
| class Person { |
| |
| name; |
| age; |
| gender; |
| |
| constructor(name, age, gender){ |
| |
| this.name = name; |
| this.age = age; |
| this.gender = gender; |
| } |
| } |
| const p1 = new Person("孙悟空", 18, "男"); |
5. 面向对象的特点
(1)封装
- 对象就是一个用来存储不同属性的容器
- 对象不仅存储属性,还要负责数据的安全
- 直接添加到对象中的属性不安全,因为可以被任意修改,确保数据的安全需要:
(1)私有化数据:将需要保护的数据设置为私有,只能在类内部使用
(2)提供setter和getter方法来开放对数据的操作
- 可以控制属性的读写权限
- 可以在方法中对属性的值进行验证
- 封装主要用来保证数据的安全
- 实现封装的方式
(1)属性私有化 加#
(2)通过getter和setter方法来操作属性
| get 属性名(){ |
| return this.#属性 |
| } |
| set 属性名(){ |
| this.#属性 = 参数 |
| } |
| |
| |
| class Person { |
| |
| #name; |
| #age; |
| #gender; |
| constructor(name, age, gender){ |
| this.#name = name; |
| this.#age = age; |
| this.#gender = gender; |
| } |
| } |
(2)多态
- JS中不会检查参数的类型,所以这就意味着任何数据都可以作为参数传递
- 要调用某个函数,无需指定类型,只要对象满足某些条件即可
- 多态为我们提供了灵活性
(3)继承
- 可以通过extends关键词来完成继承
- 当一个类继承另一个类时,就相当于另一个类中的代码复制到了当前类中(简单理解)
- 继承发生时,被继承的类为父类(超类),继承的类为子类
- 通过继承可以减少重复的代码,并可以在不修改一个类的前提下对其进行扩展
- OCP 开闭原则
| class Animal { |
| constructor(name){ |
| this.name = name; |
| } |
| sayHello(){ |
| console.log(this.name + "在叫~~~"); |
| } |
| } |
| |
| class Dog extends Animal { |
| |
| sayHello(){ |
| console.log("汪汪汪"); |
| } |
| } |
| |
| class Cat extends Animal { |
| |
| constructor(name, age){ |
| |
| super(name); |
| this.age = age; |
| } |
| |
| sayHello(){ |
| |
| super.sayHello(); |
| console.log("喵喵喵"); |
| } |
| } |
| |
| const dog = new Dog("旺财"); |
| const cat = new Cat("汤姆", 3); |
| console.log(dog); |
| console.log(cat); |
| dog.sayHello(); |
| cat.sayHello(); |
总结:封装(安全性)、继承(扩展性)、多态(灵活性)
6. 对象结构
对象中存储属性的区域实际有两个:
(1)对象自身
- 直接通过对象所添加的属性
- 在类中通过 x = y 的形式添加的属性
(2)原型对象(prototype)
- 对象中还有一些内容,会存储到其他的对象里(原型对象)
- 在对象中会有一个属性来存储原型对象,这个属性叫做 __proto__
- 原型对象也负责为对象存储属性(当我们访问对象中的属性时,会优先访问对象自身的属性,如果对象自身不包含该属性时,才会去原型对象中寻找)
- 会添加到原型对象中的情况:
(1)在类中通过xxx(){}方式添加的方法
(2)主动向原型中添加属性或方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了