JavaScript 中类的使用(笔记)

1. 类的基本定义

javascript 复制代码
class Person {
    // 构造函数
    constructor(name, age) {
        this.name = name;  // 成员变量
        this.age = age;
    }

    // 类方法
    printInformation(){
    	console.log(`name: ${this.name}; age: ${this.age}`);
    }
}

var person = new Person("Micheal", 18);
console.log(person.name, person.age);  // Micheal 18
person.printInformation();  // name: Micheal; age: 18
  • 带默认参数的构造函数

    javascript 复制代码
    class Person {
        // 带默认参数的构造函数
        constructor(name, age=18) {
            this.name = name;  // 成员变量
            this.age = age;  // age 的默认值为18
        }
    }
    
    var person1 = new Person("Micheal");
    console.log(person1.name, person1.age);  // Micheal 18
    
    var person2 = new Person("Tom", 20);
    console.log(person2.name, person2.age);  // Tom 20

2. 类的成员变量

  • 公有成员变量:

    javascript 复制代码
    class Person {
        // 带默认参数的构造函数
        constructor(name, age=18) {
            this.name = name;  // 默认为公有成员变量
            this.age = age
        }
    
        score = 80;  // 公有类成员变量,使用 this.score 方法调用
    
        // 类方法
        printInformation(){
        	console.log(`name: ${this.name}; age: ${this.age}; score: ${this.score}`);
        }
    }
    
    var person = new Person("Micheal");
    console.log(person.name, person.age, person.score);  // Micheal 18 80
    person.printInformation();  // name: Micheal; age: 18; score: 80
  • 私有成员变量:

    javascript 复制代码
    class Person {
        // 带默认参数的构造函数
        constructor(name, age=18) {
            this.name = name;  // 默认为公有成员变量
            this.age = age
        }
    
        #score = 70; // 私有成员变量(使用#开头),使用 this.#score 方法调用
    
        // 类方法
        printInformation(){
            console.log(`name: ${this.name}; age: ${this.age}; score: ${this.#score}`);
        }
    }
    
    var person = new Person("Micheal");
    console.log(person.name, person.age);  // Micheal 18
    // console.log(person.#score);  // error; 不可访问类内的私有变量
    person.printInformation();  // name: Micheal; age: 18; score: 70
  • 静态成员变量:

    javascript 复制代码
    class Person {
        // 带默认参数的构造函数
        constructor(name, age=18) {
            this.name = name;  // 默认为公有成员变量
            this.age = age
        }
    
        static score = 90; // 静态成员变量(使用static 开头),使用 类名.变量名 调用
    
        // 类方法
        printInformation(){
            console.log(`name: ${this.name}; age: ${this.age}; score: ${Person.score}`);
        }
    }
    
    var person = new Person("Micheal");
    console.log(person.name, person.age);  // Micheal 18
    console.log(person.score, Person.score);  // undefined 90
    person.printInformation();  // name: Micheal; age: 18; score: 70

3. 类的成员方法

  • get 和 set 方法

    javascript 复制代码
    class Person {
        // 带默认参数的构造函数
        constructor(name, age=18) {
            this.name = name;  // 默认为公有成员变量
            this.age = age
        }
    
        // get method
        get myage() {
            return this.age;
        }
    
        // set method
        set myage(age) {
            this.age = age;
        }
    
    }
    
    var person = new Person("Micheal");
    console.log(person.name, person.age);  // Micheal 18
    
    // 直接改变量
    person.age = 20;
    console.log(person.name, person.age);  // Micheal 20
    
    // 使用 set 方法改变量
    person.myage = 30;
    person.myage(50);  // error; Uncaught TypeError: person.myage is not a function
    console.log(person.name, person.age);  // Micheal 30
    
    // 使用 get 方法获取变量
    console.log(person.myage);  // 30
    console.log(person.myage());  // error, Uncaught TypeError: person.myage is not a function
  • 公有方法

    javascript 复制代码
    class Person {
        // 带默认参数的构造函数
        constructor(name, age=18) {
            this.name = name;  // 默认为公有成员变量
            this.age = age
        }
    
        method1(para1, para2, para3="default avlue"){
            console.log(para1, para2, para3);
        }
    
        method2 = function(para1, para2=0){
            console.log(para1, para2);
            return para1 + para2;
        }
    
    }
    
    var person = new Person("Micheal");
    
    person.method1(1, 2); // 1 2 'default avlue'
    person.method1(1, 2, 3); // 1 2 3
    
    person.method2(1);  // 1 0
    person.method2(1, 2); // 1 2
  • 私有方法

    javascript 复制代码
    class Person {
        // 带默认参数的构造函数
        constructor(name, age=18) {
            this.name = name;  // 默认为公有成员变量
            this.age = age
        }
    
        // 私有方法, 以 # 开头
        #method1(para){
            console.log("调用了私有方法", para);
        }
    
        method2(){
            this.#method1("123");
        }
    }
    
    var person = new Person("Micheal");
    
    // person.#method1(1); // error, Uncaught SyntaxError
    person.method2();  // 调用了私有方法 123
  • 静态方法: 静态方法调用直接在类上进行,不能在类的实例上调用。

    javascript 复制代码
    class Person {
        // 带默认参数的构造函数
        constructor(name, age=18) {
            this.name = name;  // 默认为公有成员变量
            this.age = age
        }
    
        // 公有方法
        method2(){
            console.log("公有方法");
        }
    
        // 静态方法, 采用 类名.方法名调用
        static method3(para){
            console.log("调用了静态方法", para);
        }
    }
    
    var person = new Person("Micheal");
    person.method2();  // 调用了私有方法 123
    
    // person.method3();  // error, Uncaught TypeError
    Person.method3("123");  // 调用了静态方法 123

4. 类的静态区域

javascript 复制代码
class MyClass {
    static field1 = console.log("static field1");
    // 静态代码块
    static {
        console.log("static block1");
    };
    static field2 = console.log("static field2");
    static {
        console.log("static block2");
    };
}

// 执行顺序
// 'static field1'
// 'static block1'
// 'static field2'
// 'static block2'

5. 类的继承

javascript 复制代码
class Rect{
    constructor(width, height){
        this._width = width;
        this._height = height;
    }

    area(){
        return this._width * this._height;
    }

    discribe(){
        console.log(`宽:${this._width}; 高:${this._height}`);
    }

    rectMethod(){
        console.log("矩形类的特有方法");
    }
}

class Square extends Rect{
    constructor(length){
        super(length, length);
        this._length = length;
    }

    area(){
        return this._length * this._length;
    }

    discribe(){
        super.discribe();  // 调用父类方法
        console.log(`边长为: ${this._length};`);
    }

    squareMethod(){
        console.log("正方形类的特有方法");
    }
}

var r = new Rect(2, 3);
console.log(r.area()); // 6
r.discribe();  // 宽:2; 高:3

var s = new Square(5);
console.log(s.area());  // 25
s.discribe();  // 宽:5; 高:5  \n 边长为: 5; 边长为: 5;
s.rectMethod();  // 矩形类的特有方法
s.squareMethod();  // 正方形类的特有方法
相关推荐
qiyi.sky3 分钟前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~6 分钟前
分析JS Crash(进程崩溃)
java·前端·javascript
哪 吒8 分钟前
华为OD机试 - 几何平均值最大子数(Python/JS/C/C++ 2024 E卷 200分)
javascript·python·华为od
我是陈泽11 分钟前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
安冬的码畜日常15 分钟前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
优雅的小武先生22 分钟前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug
虽千万人 吾往矣28 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
创作小达人31 分钟前
家政服务|基于springBoot的家政服务平台设计与实现(附项目源码+论文+数据库)
开发语言·python
郭二哈33 分钟前
C++——list
开发语言·c++·list
杨荧34 分钟前
【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统
java·开发语言·vue.js·spring boot·spring cloud·开源