[关闭]
@wy 2016-11-19T00:06:46.000000Z 字数 1967 阅读 483

聊一聊ES6中的class的使用

Ecmascript6


javascript传统做法是当生成一个对象,需要定义构造函数,然后通过new的方式完成。

  1. function StdInfo(){
  2. this.name = "job";
  3. this.age = 30;
  4. }
  5. StdInfo.prototype.getNames = function (){
  6. console.log("name:"+this.name);
  7. }
  8. //得到一个学员信息对象
  9. var p = new StdInfo()

javacript中只有对象,没有类。它是是基于原型的语言,原型对象是新对象的模板,它将自身的属性共享给新对象。这样的写法和传统面向对象语言差异很大,很容易让新手感到困惑。

定义类

到了ES6添加了类,作为对象的模板。通过class来定义一个类:

  1. //定义类
  2. class StdInfo {
  3. constructor(){
  4. this.name = "job";
  5. this.age = 30;
  6. }
  7. //定义在类中的方法不需要添加function
  8. getNames(){
  9. console.log("name:"+this.name);
  10. }
  11. }
  12. //使用new的方式得到一个对象
  13. var p = new StdInfo();

上面的写法更加清晰、更像面向对象编程的语法,看起来也更容易理解。

定义的类只是语法糖,目的是让我们用更简洁明了的语法创建对象及处理相关的继承。

  1. //定义类
  2. class StdInfo {
  3. //...
  4. }
  5. console.log(typeof StdInfo); //function
  6. console.log(StdInfo === StdInfo.prototype.constructor); //true

从上面的测试中可以看出来,类的类型就是一个函数,是一个“特殊函数”,指向的是构造函数。

函数的定义方式有函数声明和函数表达式两种,类的定义方式也有两种,分别是:类声明类表达式

类声明

类声明是定义类的一种方式,使用关键字class,后面跟上类名,然后就是一对大括号。

  1. //定义类,可以省略constructor
  2. class StdInfo {
  3. getNames(){
  4. console.log("name:"+this.name);
  5. }
  6. }
  7. // -------------------------------------
  8. //定义类,加上constructor
  9. class StdInfo {
  10. //使用new定义实例对象时,自动调用这个函数,传入参数
  11. constructor(name,age){
  12. this.name = name;
  13. this.age = age;
  14. }
  15. getNames(){
  16. console.log("name:"+this.name);
  17. }
  18. }
  19. //定义实例对象时,传入参数
  20. var p = new StdInfo("job",30)

constructor是一个默认方法,使用new来定义实例对象时,自动执行constructor函数,传入所需要的参数,执行完constructor后自动返回实例对象。
一个类中只能有一个constructor函数,定义多个会报错。

constructor中的this指向新创建的实例对象,利用this往新创建的实例对象扩展属性。

在定义实例对象时,不需要在初始化阶段做一些事,可以不用显示的写constructor函数。如果没有显式定义,一个空的constructor方法会被默认添加。constructor(){}

类表达式

类表达式是定义类的另一种形式,类似于函数表达式,把一个函数作为值赋给变量。可以把定义的类赋值给一个变量,类名可有可无,如果类名存在,则只能在类内部使用。

定义类 class后面有类名:

  1. const People = class StdInfo {
  2. constructor(){
  3. console.log(StdInfo); //可以打印出值,是一个函数
  4. }
  5. }
  6. new People();
  7. new StdInfo(); //报错,StdInfo is not defined;

定义类 class后面没有类名:

  1. const People = class {
  2. constructor(){
  3. }
  4. }
  5. new People();

立即执行的类:

  1. const p = new class {
  2. constructor(name,age){
  3. console.log(name,age);
  4. }
  5. }("job",30)

立即执行的类,在类前要加上newp为类的实例。

不存在变量提升

定义类不存在变量提升,只能先定义类后使用,跟函数声明有很大的区别。

  1. //-----函数声明-------
  2. //定义前可以先使用,因为函数声明提升的缘故,调用合法。
  3. func();
  4. function func(){}
  5. //-----定义类---------------
  6. new StdInfo(); //报错,StdInfo is not defined
  7. class StdInfo{}

extend继承

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注