class
- class是function函数的语法糖,class里的constructor相当构造函数,constructor外定义的方法相当于构造函数的原型上的方法。
- class存在暂时性死区,在class前new class将会报错。
- constructor直接定义的属性,属于实例化的私有属性,不存在于class的原型上。
- 私有化方法的实现方式
const pmd = Symbol(); // 之所以用Symbol是因为其他模块引用class时,无法获取或修改方法名为Symbol()的方法,因为它是唯一的。
class Test {
[pmd] () {
console.log(111);
}
say () {
this[pmd]();
}
}
let t = new Test();
t.say(); // 1111
t.pmd(); // error
- 静态方法兼容性较好。静态属性需要较高的浏览器版本。
- 静态属性和方法无法通过实例化对象进行方法,只能通过类直接调用。
- class 默认为严格模式
class t {
a () {
b = 1;
// let b = 1; // 使用let或者var可以正常运行
}
}
new t().a(); // VM2561:3 Uncaught ReferenceError: b is not defined
- this指向
- 如果将实例里的方法赋值给新的变量,单独调用,里面的this将会变成undefined,因为class内部默认的严格模式,严格模式下函数里的this指向undefined
- 解决办法,将类的内部方法改为箭头函数,或者在构造器中将内部方法进行绑定指向当前this。
extends
- extends为继承类的关键字,继承了某个类后,子类的实例可以获取到父类的所有属性和方法
- 子类的构造器中必须执行super方法,代表运行一遍父类的构造器,并将父类的私有属性进行继承。super方法必须写到子类构造器的顶部。
网友评论