所谓爱情,就是你总会遇到一个对的人,他让你感觉生活越来越美好,而不是再黏着过去不肯放手。
Class
- 直接使用原型对象模仿面向对象中的类和类继承,JS 中并没有一个真正的 class 原始类型, class 仅仅只是对原型对象运用语法糖。
1 | function Person(name) { |
- class 写法
1 | class Person { |
Class 语法
- 注意点
- 类的所有方法都定义在类的 prototype 属性上面,在类的实例上面调用方法,其实就是调用原型上的方法。
- 类中声明的方法不能加 function 关键字。
- 方法之间不需要逗号分隔,加了会报错。
- ES6 的 class 使用方法与 ES5 的构造函数一模一样。
- constructor 是一个构造函数方法,创建对象时自动调用该方法。
- 不能像普通函数一样调用。
- class 属性
- 实例属性:constructor 里面的属性为实例属性,即定义在 this 对象上。
- 原型属性:除去实例属性都称为原型属性,即定义在 class 类上。
1 | function Person1(name) { |
Constructor
constructor()方法是类的默认方法,通过 new 命令生成对象实例时,自动调用该方法。一个类必须有 constructor()方法,如果没有显式定义,一个空的 constructor()方法会被默认添加。
constructor 方法默认返回实例对象(即 this),可以指定返回另外一个对象。
1 | const obj = { |
getter 和 setter
- 在“类”的内部可以使用 get 和 set 关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
1 | class Person { |
Class 表达式
- 与函数一样,类也可以使用表达式的形式定义。
1 | const per = class Person { |
Class 注意
- 严格模式
- 类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。
- 不存在提升
- ES6 不会把类的声明提升到代码头。
- this 的指向
- 类的方法内部如果含有this,它默认指向类的实例。一旦单独使用该方法,很可能报错。this会指向该方法运行时所在的环境(由于 class 内部是严格模式,所以 this 实际指向的是undefined),从而导致找不到print方法而报错。
1 | const person = new class Person { |
- 解决方法
- 在构造方法中绑定this
1 | const person = new class Person { |
- 使用箭头函数
- 自动绑定词法作用域
1 | const person = new class Person { |
静态方法
- 类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
1 | class Person { |
- 注意:如果静态方法包含this关键字,这个this指的是类,而不是实例。
静态属性
1 | class Person { |