• (十) ES6 新特性 —— class类


    CSDN话题挑战赛第2期
    参赛话题:学习笔记

    目录

    constructor方法:

    class的静态成员:

    class继承

    get和set方法


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

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

    知识点:

    1) class 声明类

    2) constructor 定义构造函数初始化

    3) extends 继承父类

    4) super 调用父级构造方法

    5) static 定义静态方法和属性

    6) 父类方法可以重写

    constructor方法:

    在es5中,我们通过构造函数实例化对象:

    1. function Phone(brand, price){
    2. this.brand = brand;
    3. this.price = price;
    4. }
    5. //添加方法
    6. Phone.prototype.call = function(){
    7. console.log("我可以打电话!!");
    8. }
    9. //实例化对象
    10. let Huawei = new Phone('华为', 5999);
    11. Huawei.call();
    12. console.log(Huawei);

    接下来,我们来用class实现:

    1. lass Shouji{
    2. //构造方法 名字不能修改
    3. constructor(brand, price){
    4. this.brand = brand;
    5. this.price = price;
    6. }
    7. //方法必须使用该语法, 不能使用 ES5 的对象完整形式
    8. call(){
    9. console.log("我可以打电话!!");
    10. }
    11. }
    12. let onePlus = new Shouji("1+", 1999);
    13. console.log(onePlus);

    1. constructor方法是类的默认方法,在使用 new 命令生成实例时会自动调用此方法,如果constructor方法没有被定义,则默认添加一个空的constructor方法
    2. constructor方法默认返回实例对象(也就是this),也可以自己设置返回的对象

    class的静态成员

    静态方法和静态属性,是使用static关键字的属性和方法

    1. function Phone() {}
    2. Phone.name = '手机';
    3. Phone.change = function () {
    4. console.log('我可以改变世界');
    5. };
    6. Phone.prototype.size = '5.5inch';
    7. let nokia = new Phone();
    8. console.log(nokia.name);
    9. nokia.change();
    10. console.log(nokia.size);

     添加属性或方法要添加在原型上(prototype),实例对象是通过原型链去找属性或方法的。

    所以在这里:nokia这个实例对象是无法去获取到Phone中的name属性change方法的,只有定义在了原型链上的size可以被这个实例对象获取到。

    在class中也有这样的现象:

    1. class Phone{
    2. //静态属性
    3. static name = '手机';
    4. static change(){
    5. console.log("我可以改变世界");
    6. }
    7. }
    8. let nokia = new Phone();
    9. console.log(nokia.name);
    10. console.log(Phone.name);
    • 静态方法中的this,指向的是类class,不是类的实例。因此静态方法只能通过类名来调用,不能通过实例来调用
    • 静态方法不会被子类继承,子类不能调用

    static声明的东西属于类,而不属于实例对象

    class继承

    es5实现继承:

    父级构造函数

    1. function Phone(brand, price){
    2. this.brand = brand;
    3. this.price = price;
    4. }
    5. Phone.prototype.call = function(){
    6. console.log("我可以打电话");
    7. }

    子级构造函数

    1. function SmartPhone(brand, price, color, size){
    2. Phone.call(this, brand, price);
    3. this.color = color;
    4. this.size = size;
    5. }
    6. //设置子级构造函数的原型
    7. SmartPhone.prototype = new Phone;
    8. SmartPhone.prototype.constructor = SmartPhone;
    9. //声明子类的方法
    10. SmartPhone.prototype.photo = function(){
    11. console.log("我可以拍照")
    12. }
    13. SmartPhone.prototype.playGame = function(){
    14. console.log("我可以玩游戏");
    15. }
    16. const chuizi = new SmartPhone('锤子',2499,'黑色','5.5inch');
    17. console.log(chuizi);

    class的继承:

    直接使用extends关键字。

    1. class Phone{
    2. //构造方法
    3. constructor(brand, price){
    4. this.brand = brand;
    5. this.price = price;
    6. }
    7. //父类的成员属性
    8. call(){
    9. console.log("我可以打电话!!");
    10. }
    11. }
    1. class SmartPhone extends Phone {
    2. //构造方法
    3. constructor(brand, price, color, size){
    4. super(brand, price);// Phone.call(this, brand, price)
    5. this.color = color;
    6. this.size = size;
    7. }
    8. photo(){
    9. console.log("拍照");
    10. }
    11. playGame(){
    12. console.log("玩游戏");
    13. }
    14. }
    1. const xiaomi = new SmartPhone('小米',799,'黑色','4.7inch');
    2. // console.log(xiaomi);
    3. xiaomi.call();
    4. xiaomi.photo();
    5. xiaomi.playGame();

    注意:继承中子类需要调用super()方法继承父类的构造方法。super()在使用过程中需要注意以下两点

    (1)在访问this之前一定要调用super()

    (2)如果不调用super(),可以让子类构造函数返还一个对象

     

    重写父类的call()方法:

    1. class SmartPhone extends Phone {
    2. //构造方法
    3. constructor(brand, price, color, size) {
    4. super(brand, price); // Phone.call(this, brand, price)
    5. this.color = color;
    6. this.size = size;
    7. }
    8. photo() {
    9. console.log('拍照');
    10. }
    11. playGame() {
    12. console.log('玩游戏');
    13. }
    14. call() {
    15. console.log('我可以进行视频通话');
    16. }
    17. }

    get和set方法

    1. // get 和 set
    2. class Phone{
    3. get price(){
    4. console.log("价格属性被读取了");
    5. return 'iloveyou';
    6. }
    7. set price(newVal){
    8. console.log('价格属性被修改了');
    9. }
    10. }
    11. //实例化对象
    12. let s = new Phone();
    13. console.log(s.price);

    s.price = 'free';

    get:用来获取price属性。对象名.price就会调用该方法

    set:用来设置price属性值。对象名.price='值' 就会调用该方法

  • 相关阅读:
    LruCache源码解析
    docker镜像仓库harbor之清理镜像
    C# 实时监控双门双向门禁控制板源码
    2000-2021年各省GDP包括名义GDP、实际GDP、GDP平减指数(以2000年为基期)
    k8s实战案例之部署redis单机和redis cluster
    P1059 [NOIP2006 普及组] 明明的随机数
    kafka_3.7.0(sasl+acl)+管理工具redpanda
    【Java每日一题】— —第二十题:杨辉三角(直角三角形)。(2023.10.04)
    git基础
    最优化方法总结——梯度下降法、最速下降法、牛顿法、高斯牛顿法、LM法、拟牛顿法
  • 原文地址:https://blog.csdn.net/a45667/article/details/127129233