美文网首页ES6
ES6学习-类(Class)的原理2

ES6学习-类(Class)的原理2

作者: YINdevelop | 来源:发表于2018-04-23 11:51 被阅读57次

1.基本语法

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);

ES6引入了Class(类)的概念来实现构造函数。ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的class改写,就是下面这样

//定义类
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}
var p=new Point(1,2)

1.constructor方法,这就是构造函数的写法

2.定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以

3.方法之间不需要逗号分隔,加了会报错

上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造函数的写法,而this关键字则代表实例对象p。

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

2.constructor方法

一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

class Point {
}

// 等同于
class Point {
  constructor() {}
}

3.类的实例对象

生成类的实例对象的写法,与 ES5 完全一样,也是使用new命令

class Point {
  // ...
}

// 实例
var point = new Point(2, 3);

4.类的继承

Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多

class Point {
}

class ColorPoint extends Point {
}

上面代码定义了一个ColorPoint类,该类通过extends关键字,继承了Point类的所有属性和方法。但是由于没有部署任何代码,所以这两个类完全一样,等于复制了一个Point类。

子类必须在constructor方法中调用super方法,否则新建实例时会报错

子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象。如果不调用super方法,子类就得不到this对象。

class Point { /* ... */ }

class ColorPoint extends Point {
  constructor() {
  }
}

let cp = new ColorPoint(); // ReferenceError

如果子类没有定义constructor方法,这个方法会被默认添加

class ColorPoint extends Point {
}

// 等同于
class ColorPoint extends Point {
  constructor() {
    super();
  }
}

5.super关键字

super作为函数调用时,代表父类的构造函数

ES6 要求,子类的构造函数必须执行一次super函数,否则 JavaScript 引擎会报错

super虽然代表了父类的构造函数,但是返回的是子类的实例,即super内部的this指的是子类的实例

class A {
  constructor() {
    console.log(new.target.name);
  }
}
class B extends A {
  constructor() {
    super();
  }
}
new A() // A
new B() // B

作为函数时,super()只能用在子类的构造函数之中,用在其他地方就会报错。

class A {}

class B extends A {
  m() {
    super(); // 报错
  }
}

相关文章

  • ES6学习-类(Class)的原理2

    1.基本语法 JavaScript 语言中,生成实例对象的传统方法是通过构造函数。 ES6引入了Class(类)的...

  • ES6 class与继承

    class是什么 class是定义类的方法。ES6之前用构造函数的方式定义类,ES6引入了class。 class...

  • 26- class 类与继承

    1、ES5 中基于原型的构造函数 2、ES6 的 class关键字 ES6 引入了 Class(类)这个概念,作为...

  • 深入理解JS面向对象 - JavaScript实现继承的五种方式

    一、类与实例 1. 类的声明 传统function类的声明 ES6中的class声明 1.1 ES6 class与...

  • 面向对象

    一、es6的面向对象 1、class关键字,类和构造器分开了2、class里面直接加方法 以前的构造函数 es6:...

  • 2JavaScript设计模式--class/extends

    ES6语法 类 class ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板...

  • react组件

    es6 的class类的继承 运用es6 class继承 通过继承React.Component类来定义一个组件

  • 深入理解ES6中class的this指向

    在ES6中,引入了类似其他语言的类的写法:即class(类),作为类对象模板。ES6 的class可以看作一个语法...

  • 第三十二节: ES6 Class类

    1. ES6 Class 类 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板...

  • 第三十二节: ES6 Class类

    1. ES6 Class 类 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板...

网友评论

    本文标题:ES6学习-类(Class)的原理2

    本文链接:https://www.haomeiwen.com/subject/ovwklftx.html