es6 的 class 与 es5 的语法对比

bug收集:专门解决与收集bug的网站

网址:www.bugshouji.com

01

ECMAScript 5 中类的实现

大家都知道 ECMAScript 5 中是没有 class 这个概念的

但是 javascript 中还是可以使用面向对象的方式去编写代码的,因为面向对象是一种思想。ECMAScript 5 中使用原型对象来实现类似 class 的作用

代码如下:

代码语言:javascript
复制
function Point(x, y) {
  this.x = x;
  this.y = y;
}

Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};

var p = new Point(1, 2);

上面这种写法跟传统的面向对象语言(比如 C++ 和 Java)差异很大,很容易让新学习这门语言的程序员感到困惑。

02

ECMAScript 6 中类的实现

ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。

代码如下:

代码语言:javascript
复制
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}

constructor 方法,这就是构造方法,而 this 关键字则代表实例对象,实例的属性一般都在这里定义。

toString 方法,是类中定义的一个实例方法。注意:定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。

03

两者的关系

基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已

ES6 的类,完全可以看作构造函数的另一种写法。

代码语言:javascript
复制
class Point {
  // ...
}

typeof Point // "function"
Point === Point.prototype.constructor // true

上面代码表明,类的数据类型就是函数,类本身就指向构造函数。

04

ECMAScript 6 中类的说明

class 的使用

代码语言:javascript
复制
class Bar {
  doStuff() {
    console.log('stuff');
  }
}

var b = new Bar();
b.doStuff() // "stuff"

类的 prototype 属性

事实上,类的所有方法都定义在类的prototype属性上面

代码语言:javascript
复制
class Point {
constructor() {
// ...
}

toString() {
// ...
}

toValue() {
// ...
}
}

// 等同于

Point.prototype = {
constructor() {},
toString() {},
toValue() {},
};

在类的实例上面调用方法,其实就是调用原型上的方法。

代码语言:javascript
复制
class B {}
let b = new B();

b.constructor === B.prototype.constructor // true

本文,参考阮一峰的文章,地址如下:

https://es6.ruanyifeng.com/#docs/class