class 类

class Test {
    #name; // 私有属性 es2019
    constructor(x, n) {
        // 私有属性
        let _name = 'hew'
        this.#name = n
        this.setName = function (name) {
            _name = name;
        };
        this.getName = function () {
            return _name;
        };

        /* 对应es5 的构造函数 */
        this.name = 12222
        this.x = x || 'original x'

        /* 这里类似使用原来的构造函数添加 prototype */
        this.__proto__.m = 23333 
    }

    /* 类的所有方法都是定义在类的prototype上 */
    getX() {
        console.log(this.#name)
        console.log(this.getName())
        return this.x
    }
}

new Test().getX()   // 'original x'
  • 在 class 中用 = 声明变量属于 Field declarations ,实际将被挂载到 实例属性上读取优于原型链

静态属性和方法

  • 静态属性: 在属性前加 static 或是 ClassName.propertyName = 'xx' 方式设置
  • 在方法前加 static
  • 只能通过类来调用 不能被子类继承(静态方法不行,静态属性可以),静态方法中的this指向类而非实例

继承

super :表示父类的构造函数,用来新建父类的this对象

super(参数) 这里的参数是传给父类的构造函数

子类必须在 constructor 方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。constructor 中this指向实例

ES6 的继承机制,先创造父类的实例对象this(所以必须先调用super方法),然后再用子类的构造函数修改this

单向链表

class Node {
    constructor(value) {
        this.value = value
        this.next = null
    }
}

class ListNode {
    constructor() {
        this.length = 0
        /* 头指针 */
        this.head = null
    }

    append(value) {
        const node = new Node(value)
        if(this.head) {
            let endHead = this.head
            /* 找到最后一个 node */
            while(endHead.next) {
                endHead = endHead.next
            }
            endHead.next = node
        } else {
            this.head = node
        }

        this.length++
    }
}
Last Updated:
Contributors: Warren