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++
}
}