面向对象,来了

进入 ES6 的实质性学习

参考书:http://es6.ruanyifeng.com/

ES6 的很多新特性,就是在原有的 ES5 基础上添加了语法糖 ,也就是用 ES5 可实现 但是如果用 ES6 的语法来实现,就会看起来代码更简介明了。关于这些小的语法糖,Peter 的 建议是不用一次都学会,因为用老的 ES5 语法(写到 ES6 )项目中,也是完全合法。

具体就是指书中的这些章节:

  • let和const命令
  • 变量的解构赋值
  • 字符串的扩展
  • 正则的扩展
  • 数值的扩展
  • 数组的扩展
  • 函数的扩展
  • 对象的扩展

这些可以逐步学习,逐步用到项目中。但是,对于我们后续要开始的 Nodejs + Reactjs 这个方向的学习,目前必须要掌握的主要是:

  • 模块化开发,import/export
  • 面向对象编程,class 关键字的使用

其实这两个知识点也是紧密相关的,我们先从面向对象编程开始学起。

Object Oriented Programming 面向对象编程

参考:http://haoqicat.com/o-o-js

基本概念:面向对象编程,是一种基于 对象 这个概念的编程方法论。对象中 可以包含数据,一般被成为属性 ,也可以包含函数,一般被成为方法

OOP: 类和对象

类( class )是多个对象( object )的抽象,对象是类的实例。人,就可以是一个类 ,比如人可以有名字,身高这些属性,但是没有具体值,所以说类可以理解为一个空的木桶。 对象是类的实例,具体的一个人,就可以叫做

人这个类的一个对象

例如,Peter 就可以是人这个类的一个对象。对象的特点是有具体数据的,例如,给定 一个人 Peter ,那我们可以得到他的具体的姓名,身高的具体值。所以对象可以理解为 木桶中装的水。

下面用代码的形式来表述一下类和对象的关系。在面向对象编程的过程中,我们都是先定义 类

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

上面 name 就是一个属性 ,constructor() 是一个方法。

有了类之后,我们就可以实例化出,无穷多个对象了

let peter = new Person('happypeter');

console.log(peter.name);
  ```

上面 `new` 是一个关键字,意思是“新建一个该类的实例” 。得到的 `peter` 就是
一个对象,我们可以得到 peter 中的 name 的具体值。

下面我们对一些不太好理解的点,再详细解释一下:

### constructor 构造函数

一个类里面可以定义多个方法,如下

class Person { constructor() { console.log(‘hello1’); } sayHello2() { console.log(‘hello2’); } } let peter = new Person; ```

上面 constructor 是一个特殊的方法(拼写是严格的),它的特点是在对象 被创建的时候,也就 let peter = new Person 这一句执行的时候,自动被 呼叫的一个方法。而其他的方法,都不会被自动执行。

同时,constructor 也可以接受参数,如下

class Person {
  constructor(name) {
    console.log('My Name is ' + name);
  }
}
let peter = new Person('peter');

如上,给 constructor 传递参数的方式,就是在 new 一个新对象的时候,在 类名之后直接加括号来传递,例如 Person('peter')

定义自己的方法

constructor 是一个特殊的方法,它的拼写就是 constructor ,拼错了,就不会 被自动执行了。或者说,就成了一个普通方法了。通常我们的类里面都会定义很多普通 方法的。

class Person {
  sayHello(name) {
    console.log('hello ' + name);
  }
}
let peter = new Person;

那么创建新对象的时候,sayHello 是不会被自动执行的,那么如何来调用呢?

peter.sayHello('lily');

this 关键字

this 指的就是当然对象

class Person {
  constructor(name) {

  }
  sayName() {
    console.log('my name is' + name);
  }
}
let peter = new Person('peter');
peter.sayName();

此时如果直接看 peter.sayName() 会发现 name 的值为空。

解决这个问题就可以使用 this 关键字。

class Person {
  constructor(name) {
    this.name = name;
  }
  sayName() {
    console.log('my name is' + this.name);
  }
}
let peter = new Person('peter');
peter.sayName();

这样 sayName() 函数中就可以拿到 this.name 的值了。

es6入门

  • let,const
  • 解构赋值
  • 箭头函数
  • 字符串模板
  • Default + Rest + Spread