ES6+新特性之 Class 和箭头函数(二)

328 阅读2分钟

ES6+ 新特性

我们把 ES6(也叫 ES2015) 以后更新的所有 JavaScript 标准规范新增的 API 叫做 ES6+ 新特性。

最新的 ES6 到 ES12 语法引入的很多新特性,能让很多依赖第三方库才能做到的事用原生 JS 寥寥几行代码就可迎刃而解。

本文只列举常用的特性和最基础的使用场景,详细介绍的话内容量将十分巨大,不妨通过 Google 搜索国外开发者的文档以及参阅 ECMA 官方发布的标准

接上篇ES6+新特性(一)

ES6

ES6 - Class

对于面向对象编程而言,主要关注类的声明、属性、方法、静态方法、继承、多态、私有属性。ES6 之前类是通过构造函数来实现的,在 ES6 中把类的声明专业化了,通过 class 语法来代替 function 的方式:

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  say() {
    const str = `Hello, my name is ${this.name}, ${this.age} years old!`;
    console.log(str);
  }
}

class Chinese extends Person {
  constructor(name, age) {
    super(name, age);
    this.country = 'Chinese';
  }

  say() {
    const str = `Hello, my name is ${this.name}, ${this.age} years old! I'm ${this.country} Person`;
    console.log(str);
  }
}

/* ES6 class */
const person = new Person('lusy', 25);
const chinesePerson = new Chinese('王', 35);

person.say();
chinesePerson.say();

这里有个注意点就是,如果是子类继承父类,那么子类的constructor 内部必须有 super(),否则会报错。

从上面代码可以看出:

  • 类里面有一个 constructor() 方法,这就是构造方法。
  • this 关键字指向实例对象。
  • 给类增加自定义方法的时候,前面不需要加上 function 关键字,直接把函数定义放进去了就可以了。另外,方法与方法之间不需要逗号分隔,加了会报错。
  • 类的所有方法(constructor() 和自定义方法)都定义在类的 prototype 属性上面,因此在类的实例上面调用方法,其实就是调用原型上的方法。

ES6 - 箭头函数

  • 几种箭头函数写法:

如果只有一个参数,可以省略括号;如果大于一个参数或没有参数,一定要带括号。

// 只有一个参数
let hello1 = name => {
  console.log('say hello', name)
}

// 没有参数
let hello2 = () => {
  console.log('say hello')
}

// 多个参数
let hello3 = (name, age) => {
  console.log('say hello', name, age)
}
  • this 指向 箭头函数中 this 指向函数定义时所在的外层作用域的 this,即包裹箭头函数的函数。

如果包裹箭头函数的,依旧是个箭头函数,则继续往外层找,直到 window(浏览器环境下非严格模式)或 undefined(严格模式)。

var scope = 'window'
var obj = {
  scope: 'obj',
  funcScope: function() {
    console.log('当前作用域:', this.scope)
  },
  arrayFuncScope: () => console.log('当前作用域:', this.scope)
}
var obj2 = {
  scope: 'obj2'
}
obj.funcScope()                 // obj
obj.arrayFuncScope()           // window
obj.funcScope.call(obj2)       // obj2 
obj.arrayFuncScope.call(obj2)  // window

注意点

  • 箭头函数不可以当作构造函数
  • 箭头函数不可以使用 arguments 对象

没看够?不着急!我还没说完呢,您接着看下篇文章:ES6+新特性(三)

🌴 同步更新

掘金专栏 | 知乎专栏 | Github | 简书专栏 | CSDN | segmentfault