记录下自己的一些理解
1.类名就是构造函数名,class相当于一个结构体,将原型和构造函数都放在一起了。而类继承的方式,是等同于ES5中的组合构造函数,即子类构造函数会调用父类构造函数创建实例;子类的原型继承父类原型,实现方式是将子类的prototype作为一个对象,这个prototype对象中也存在一个prototype属性,指向父类的prototype对象。
2.class和ES5中继承有什么关系
class继承很类似组合构造继承,即分构造函数和原型两个方面继承父类,子类构造函数通过调用父类构造函数继承子类;子类原型通过添加prototype属性继承父类原型。
不过有一个区别,就是class不存在声明。
let Foo = class {};
class Bar extends Foo {
}
若是class有提升,但let是没有提升的,会导致无法识别Foo。
3.声明静态属性、私有属性、实例属性
class MyClass {
static myStaticProp = 42; //静态属性
name = ‘yxg‘; //实例属性
#salary; //私有属性
constructor() {
console.log(MyClass.myStaticProp); // 42
console.log(this.name); //‘yxg‘
this.#salary = 10;
}
}
4.静态方法、私有方法、共有方法
4.1 理解静态方法为什么不可以被实例对象调用,而共有方法确可以。原因就在于这两种方法保存的地址不一样。
class Person {
constructor() {
//如果有实例方法的话,需要声明在构造函数,
// 但这样会为每一个实例开辟一个内存地址用于保存实例方法,所以实例方法一般要极力避免
}
static sta(){ //静态方法
}
pub(){ //保存在原型中的共有方法
}
}
let obj = new Person();
console.log(obj);

可以看到pub这个共有方法,是保存obj.__proto__中的(可以将__proto__理解为就是原型)。 
而sta这个静态方法是保存在constructor中的,所以通过className.静态方法名调用。同理,也可以去查看私有属性、静态属性的保存位置也是如此的。
4.2 私有方法的实现,在方法名前加_其实屁用都没有,即不影响保存地址,也不影响调用方法,也不影响继承。所以实现私有方法的靠谱方法,就是用唯一的Symobol来作为方法名。
5.super关键字
super在子类中作为对象时,有一个很奇怪的问题,就是赋值时super指向子类,取值时指向父类,直接上一段代码。
class Dad {
}
Dad.prototype.x = 100;
class Son extends Dad{
constructor(props) {
super();
this.x = props;
super.x++; //这句是真的牛皮,this.x = super.x + 1;
console.log(super.x); //100
console.log(this.x); //101
}
}
const obj = new Son(10);
6.__proto__和prototype的理解
__proto__和prototype如果翻译的话,可以分别翻译成“继承自”、“原型”。具体待更。。。。。。。。
原文:https://www.cnblogs.com/yuxingguang/p/12821973.html