清淨
  • Java

    • Java 基础
  • 框架

    • Flyway
    • MapStruct
    • Spring Cloud
  • 中间件

    • Elasticsearch
    • Redis
    • RabbitMQ
    • Kafka
  • 三剑客

    • HTML
    • CSS
    • JavaScript
  • 进阶

    • jQuery
    • ECMAScript6
    • TypeScript
  • Vue

    • Vue2
    • Vue3
    • VuePress
  • Linux
  • Jenkins
  • Maven
  • MySQL
  • 插件工具
  • 代码集成
  • 其它

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • 设计模式
迁移日志
订阅号
微信订阅号
微信订阅号
GitHub
  • Java

    • Java 基础
  • 框架

    • Flyway
    • MapStruct
    • Spring Cloud
  • 中间件

    • Elasticsearch
    • Redis
    • RabbitMQ
    • Kafka
  • 三剑客

    • HTML
    • CSS
    • JavaScript
  • 进阶

    • jQuery
    • ECMAScript6
    • TypeScript
  • Vue

    • Vue2
    • Vue3
    • VuePress
  • Linux
  • Jenkins
  • Maven
  • MySQL
  • 插件工具
  • 代码集成
  • 其它

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • 设计模式
迁移日志
订阅号
微信订阅号
微信订阅号
GitHub
  • ECMAScript6

    • 简介
    • let
    • const
    • 解构赋值
    • 对象简写
    • 箭头函数
    • 参数默认值
    • 剩余参数
    • 可选链操作符
    • 空值合并运算符
    • 逻辑空赋值
    • 模板字符串
    • 扩展运算符 (展开语法)
    • Array 扩展
    • String 扩展
    • Number 扩展
    • Object 扩展
    • 迭代器
    • 生成器
    • BigInt
    • Set
    • Map
    • class
    • 模块化
    • globalThis
    • Promise
    • async-await

class

ES6 引入了 class 关键字来定义类,使得面向对象编程更加直观和易于理解。下面是一些关于 ES6 类的基本用法。

// ES5 语法
function Phone(name, price) {
  this.name = name
  this.price = price
}
Phone.prototype.call = function () {
  console.log('打电话')
}
let xiaomi = new Phone('小米', 1999)
xiaomi.call()
console.log(xiaomi)

// ES6 
class Phone {
  // constructor 的方法名是固定的, 当构造实例时, 会自动调用此方法
  constructor(name, price) {
    this.name = name
    this.price = price
  }
  // 只能通过这种方式来定义方法, 不能使用 function
  call() {
    console.log('打电话啦')
  }
}
let xiaomi = new Phone('小米', 1999)
xiaomi.call()
console.log(xiaomi)

静态成员

在 js 中,静态成员 (包括方法) 只允许类访问,不能通过实例对象来访问。这与原型上的属性或方法不同。

// ES5
function Phone() {
}
Phone.name = 'pname'
Phone.size = 'psize'

let xiaomi = new Phone()
console.log(xiaomi.name) // undefined

// ES6
class Phone {
  static name = '手机'
  static change() {
    console.log('change')
  }
}
let xiaomi = new Phone()
console.log(xiaomi.name) //undefined

继承

  • ES5 语法

    function Phone(name, price) {
    this.name = name
    this.price = price
    }
    Phone.prototype.call = function() {
    console.log('打电话')
    }
    function SmartPhone(name, price, color) {
    Phone.call(this, name, price)
    this.color = color
    }
    SmartPhone.prototype = new Phone
    SmartPhone.prototype.constructor = SmartPhone
    
    let xiaomi = new SmartPhone('xiaomi', 1999, 'black')
    console.log(xiaomi)
    
  • ES6 语法

    class Phone {
    constructor(name, price) {
        this.name = name
        this.price = price
    }
    call() {
        console.log('superCall')
    }
    }
    class SmartPhone extends Phone {
    constructor(name, price, color) {
        super(name, price)
        this.color = color
    }
    // 重写
    call() {
        super.call()
        console.log('subCall')
    }
    }
    let xiaomi = new SmartPhone('xiaomi', 1999, 'black')
    xiaomi.call()
    console.log(xiaomi)
    

getter 和 setter

只要访问成员属性,就会自动调用该属性的 get 方法。get 方法的返回值就是属性值。

class Phone {
  get price() {
    console.log('get price')
    return 'price1'
  }
  set price(newVaule) {
    console.log('set price')
  }
}
let xiaomi = new Phone()
xiaomi.price = 'aaaaaaa'
console.log(xiaomi.price)

私有属性

对象中的私有属性使用 # 表示,它不能被外部直接访问。

class Person {
  #age;
  name;
  constructor(age ,name) {
    this.#age = age
    this.name = name
  }
}
let person = new Person(10, 'zs')
console.log(person)
console.log(person.#age) // 报错
想要编辑此页?
上次更新: 2025/6/5 23:39
贡献者: Junfeng Dai
←Map模块化→
[ 纸上得来终觉浅绝知此事要躬行 ]
Copyright © 2021-present Junfeng Dai
蜀ICP备2021009537号