ES6看完必会第十章------ Class 类 (可私信解惑,不会来捶我)

class 声明

JavaScript语言的传统方法是通过构造函数,定义并生成新对象。

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

基本上,ES6 的class可以看作只是一个语法糖(指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。),它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

Class不存在变量提升(hoist),这一点与ES5完全不同。

使用class关键字创建一个类代码如下:

class Person{
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }       // 方法之间不加逗号隔开,否则报错     
  sum(){        // 方法前面不用加function
  	var sum=this.x+this.y;
    return sum
  }
}

上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,通过new命令生成对象实例时,自动调用该方法。而this关键字则代表实例对象。

构造函数的prototype属性,在ES6的“类”上面继续存在。所有的方法还是在prototype属性上。

类的方法内部如果含有 this,它默认指向类的实例。

  • 类的实例对象

生成类的实例对象的写法,与ES5完全一样,也是使用new命令。如果忘记加上new,像函数那样调用类,将会报错。

// 报错
var p= Person(2, 3);
// 正确
var p= new Person(2, 3);

与ES5一样,类的所有实例共享一个原型对象

var p1 = new Person(2,3);
var p2 = new Person(3,2);
p1.__proto__ === p2.__proto__         // true

上面代码中,p1和p2都是Person的实例,它们的原型都是Point.prototype,所以__proto__属性是相等的。

 

可以通过实例的 __proto__ 属性为Class添加方法。在上一节Person类基础上添一个名为newF方法:

class Person{

  constructor(x, y) {
    this.x = x;
    this.y = y;
  }       

  sum(){        
      var sum=this.x+this.y;
      return sum

  }

}

p1= new Person()

p1.__proto__.newF= function () { return '这里是新创建的方法' };        // 给类添加一个新方法 newF

console.log(  p1.newF() )        // 这里是新创建的方法
  • class的继承

Class之间可以通过extends关键字实现继承,这比ES5的通过修改原型链实现继承来得清晰、方便很多。

class childPerson extends Person{}

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

如果继承父类后要添加自己的属性和方法,如下:

class childPerson extends Person {
  constructor(x, y, color) {
    super(x, y);         // 调用父类的constructor(x, y)
    this.color = color;
  }
  toString() {
    return this.color + ' ' + super.toString();         // 调用父类的toString()
  }
}

子类必须在constructor方法中调用super方法且必须出现在 this 之前。否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。

 

  • super关键字

super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。

第一种情况,super作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次super函数

class A {}
class B extends A {
  constructor() {        // 构造函数
    super();    // 作为函数时,super()只能用在子类的构造函数之中,用在其他地方就会报错。
  }
}

上面代码中,子类B的构造函数之中的super()代表调用父类的构造函数。这是必须的,否则 JavaScript引擎会报错。

 

第二种情况,super作为对象时,指向父类的原型对象。

class B extends A {
  constructor() {
    super();
    console.log(super.p());     // 指向父类的p方法
  }
}

上面代码中,子类B当中的super.p(),就是将super当作一个对象使用。此时super相当于父类A。

这里需要注意,由于super指向父类的原型对象,所以定义在父类实例上的方法或属性是无法通过super调用的。

super关键字

super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。

第一种情况,super作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次super函数

class A {}
class B extends A {
  constructor() {        // 构造函数
    super();    // 作为函数时,super()只能用在子类的构造函数之中,用在其他地方就会报错。
  }
}

上面代码中,子类B的构造函数之中的super()代表调用父类的构造函数。这是必须的,否则 JavaScript引擎会报错。

 

第二种情况,super作为对象时,指向父类的原型对象。

class B extends A {
  constructor() {
    super();
    console.log(super.p());     // 指向父类的p方法
  }
}

上面代码中,子类B当中的super.p(),就是将super当作一个对象使用。此时super相当于父类A。

这里需要注意,由于super指向父类的原型对象,所以定义在父类实例上的方法或属性是无法通过super调用的。

  • class静态方法

类相当于实例的原型,所有在类中定义的方法都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

class Foo {
  static classMethod() {
    return 'hello';
  }
}
Foo.classMethod()         // 'hello'           直接类调用
var foo = new Foo();      // 创建一个实例
foo.classMethod()        // 报错内容: foo.classMethod is not a function        实例调用报错

上面代码中,Foo 类的classMethod 方法前有static 关键字,表明该方法是一个静态方法,可以直接在Foo 类上调用,而不是在Foo 类的实例上调用。如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法。

父类的静态方法,可以被子类继承。静态方法也是可以从super对象上调用的。

 

第十一章:ES6看完必会第十一章------ Map和Set数据结构 (可私信解惑,不会来捶我)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值