class

简介
由于类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面。Object.assign方法可以很方便地一次向类添加多个方法。
另外,类的内部所有定义的方法,都是不可枚举的(non-enumerable)。
严格模式
类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。
constructor 方法
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
类的实例对象
必须new
与 ES5 一样,实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。
可以通过实例的proto属性为“类”添加方法。但是所添加的所有方法都会给所有被实例对象使用
Class 表达式
与函数一样,类也可以写成表达式
const MyClass = class Me {
getClassName() {
return Me.name;
}
};
上面代码使用表达式定义了一个类。需要注意的是,这个类的名字是MyClass而不是Me,Me只在 Class 的内部代码可用,指代当前类。
如果类的内部没用到的话,可以省略Me,也就是可以写成下面的形式。
const MyClass = class { // };
用Class表达式,可以写出立即执行的class
let person = new class {
constructor(name) {
this.name = name;
}

    sayName() {
        console.log(this.name);
    }
}('张三');

person.sayName(); // "张三"

不存在变量提升
私有方法和私有属性
一种是通过把私有方法写在类外面,通过call(this)调用。
另一种是通过symbol来私有化变量,在通过变量来调用方法和属性变量
const bar = Symbol(‘bar’);
const snaf = Symbol(‘snaf’);

    export default class myClass{

        // 公有方法
        foo(baz) {
            this[bar](baz);
        }

        // 私有方法
        [bar](baz) {
            return this[snaf] = baz;
        }

        // ...
    };
私有属性和私有方法在前面家#

this 的指向
class test {
constructor(){
//为了printName被分离出去后也能被调用,this指向还是test
this.printName = this.printName.bind(this);
}
}
如果是箭头函数的话,this就是指向声明时的this
还有一种解决方法是使用Proxy,获取方法的时候,自动绑定this。
name 属性
由于本质上,ES6 的类只是 ES5 的构造函数的一层包装,所以函数的许多特性都被Class继承,包括name属性。
Class 的取值函数(getter)和存值函数(setter)
都是被默认添加到了描述对象prototypedescription上
Class 的 Generator 方法
前面加个*
Class 的静态方法
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
注意,如果静态方法包含this关键字,这个this指的是类,而不是实例。静态方法可以和普通方法重名
父类的静态方法可以被继承
Class 的静态属性和实例属性
可在类里直接定义实例属性
静态属性直接在前面加个static
new.target 属性
new是从构造函数生成实例对象的命令。ES6 为new命令引入了一个new.target属性,该属性一般用在构造函数之中,返回new命令作用于的那个构造函数。如果构造函数不是通过new命令调用的,new.target会返回undefined,因此这个属性可以用来确定构造函数是怎么调用的。
class类中调用new.target返回当前class,在子类中调用则父类也返回子类的class
利用这个特点,可以写出不能独立使用、必须继承后才能使用的类。
class Shape {
constructor() {
if (new.target === Shape) {
throw new Error(‘本类不能实例化’);
}
}
}

class Rectangle extends Shape {
    constructor(length, width) {
        super();
        // ...
    }
}

var x = new Shape();  // 报错
var y = new Rectangle(3, 4);  // 正确