在其余的众多编程语言中(例如Python),都有class(类)这个概念,而JS在ES6规范中终于补上了编程
类是具备一些相同特征的对象,例如车都有颜色、轮子、座椅等元素,还有行驶时速,只不过不一样的车,这些特征的值是不同的编程语言
实际上class的本质,一方面是面向对象的思想,另外一方面则是封装函数
声明class时,咱们直接用class关键字+类名,在其中添加构造函数constructor来给后续实例化的对象添加属性/方法,这里的this就指向实例化被生成的对象this
这里的构造函数必须命名成constructor,用来接收实例化时传入的参数(也就是new 类名后的参数),可是具体如何处理还得看构造函数内部的书写对象
类比于对象中的方法,也能够给类添加方法,例如图例中的speedUp,相比于constructor是独立存在的blog
其实某种程度上说,class有点像工厂模式声明对象继承
静态方法/属性是在类里声明的,只属于类本身的,不可被类实例拥有,只是类本身拥有内存
静态方法声明时用static关键字,写在类的内部,而静态属性则用类名.属性名=属性值的方法声明,能够写在类的内部/外部开发
此外,类里的方法和静态方法若是同名,不会引发冲突get
能够用静态属性来检测这个类的实例的数量,原理就是每次建立一个新的类,都是在调用类里的constructor方法,里面的代码都会被执行
这里因为Car.num这个属性是一个全局变量,所以不会被回收,但注意要在声明对象前挂上静态属性,不然没法修改静态属性
相比于直接在类上添加属性(动态,依靠外界传入),能够在类上绑定一个静态属性,这个属性的属性值能够经过访问类来找到
好处在于:让属性和类关联,避免污染全局
这里主要是提供一个类的方法,不用实例化生成对象就可直接调用的方法
能够模仿函数表达式,把一个类赋值给一个常量/变量(主要看声明)
注意声明时,类名能够在类中访问,但不可在类外面访问(这一点也相似于函数的表达式声明)
类表达式还能够自执行(相似于函数的特性),但实际开发中基本不用
相似于在属性中提供一个钩子,能够在获取/设置属性值时候作一些额外的事情,这些事情在设置/访问以前执行
实际上在ES5中,get/set方法就有了,能够添加在对象中,用get/set声明+属性名+(){}的方法声明(也能够理解成声明一个与属性名同名的函数),表示在访问/修改属性的时候会执行的操做
注意set中必须传入一个参数,即为设置的属性值,不然报错
若是执行的操做有和获取/修改属性相关的,则可能引起栈内存溢出
也能够用Object的defineProperty方法来设置,直接在第三个参数里写上get和set的两个函数,至关于给对象添加两个方法
不一样于方法中的set,这里set函数中不必定要加形参
须要注意如下问题:
1.用defineProperty方法添加的属性不可用for-in语句遍历到的,须要给其添加enumerable属性(true),可是该属性一旦设置不可修改,不然报错
(补充案例)
2.若是一个属性有get和set方法,必须用defineProperty方法设置其为writable,不然属性是没法被修改的
(案例)
此外,访问/设置属性时,先调用get/set方法,再调用输出(console.log)等方法
(补充个案例说明问题)
(关于set和get实在是太多地方不理解……)
用来获取类的名称
若是是类表达式声明,有类名称则返回类名称,不然返回赋值的变量名称
返回的是new声明后的类/函数
该属性不可直接调用,须要放在类/函数里
ES6的类也能够继承,其中被继承的类叫父类(基类),继承的类为子类
相似于对象的继承,类的继承也可让子类获取父类的方法和属性,从而实现子类属性/方法的添加
ES6的类中,可以使用extends来继承父类的属性,并在constructor里给子类的属性赋值前,使用super方法来调用父类的构造函数,以实现继承
上面的例子中能够看出,super能够在子类的构造函数中使用,以调用父类构造函数
此外还能够做为对象的方式调用,可是在静态方法/非静态方法里使用时,访问到的分别是父类的原型/对象
此外,在调用super时,父类的this始终是子类的this