JS深入学习笔记 - 第二章.类和对象

这篇具有很好参考价值的文章主要介绍了JS深入学习笔记 - 第二章.类和对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3.类和对象

3.1面向对象

这里顺带提一句学习JAVA时,老师说的面向对象和面向过程的区别:

面向过程:强调做什么事情,具体什么步骤。举个把大象放进冰箱的例子:

  1. 打开冰箱门
  2. 把大象放进冰箱
  3. 关上冰箱门

面向对象:强调的是做动作的主体(称之为对象)

  • 冰箱:打开操作
  • 冰箱:放的操作(放的可以是大象也可以是老鼠)
  • 冰箱:关闭的操作

JS深入学习笔记 - 第二章.类和对象

 

面向对象的思维特点:

  1. 抽取(抽象)对象共用的属性和行为封装成一个类(模板)
  2. 对类进行实例化,创建类的对象(具体的东西)

3.2对象

现实中:对象是一个具体的事物,比如一本书、一辆车、一个人。

在js中:对象是一组无序的相关属性和方法的集合,所有的事物都是对象,如:字符串、数组、数值、函数等。

 

对象是由属性方法组成的:

  • 属性:事物的特征,在对象中用属性来表示
  • 方法:事物的行为,在对象中用方法来表示

3.3 类

ES6中新增了类的概念,可以使用class关键字来声明一个类,之后以这个类来实例化对象

类抽象了对象的公共部分,它泛指某一大类,

对象特指**某一个,通过类实例化一个具体的对**象。


类的本质:

  1. class本质还是function
  2. 类所有的方法都定义在类的prototype属性
  3. 类创建的实例里面也有__ proto__ 指向类的prototype原型对象
  4. 所以ES6的类的绝大部分功能。ES5都可以做到,新的class的写法只是让对象原型的写法更加清晰、更面向对象编程的语法。
  5. 所以ES6的类其实就是语法糖
    class Father {
        
    }
    console.log(Father instanceof Function); //true
    //(1)类有原型对象prototype
    console.log(Father.prototype);
    //(2)类的原型对象prototype 里面有 constructor 指向类本身
    console.log(Father.prototype.constructor);
    //(3)类可以通过原型对象添加方法
    Father.prototype.speak = function () {
      console.log("speak");
    };
    //(4)类创建的实例对象有 __proto__ 指向类的原型对象
    const zooey = new Father();
    console.dir(zooey.__proto__ === Father.prototype); //true
 

3.4创建类和实例化对象

 
//创建类
 class Star {
     //共有属性放在constructor中
      constructor(uname, age) {
        this.name = uname;
        this.age = age;
      }
    }
    // 利用类实例化对象
    const ldh = new Star("刘德华", 19);
    const syz = new Star("孙燕姿", 18);
    //打印查看
    console.log(ldh);
    console.log(syz);
  • 注意:
  1. 通过class关键字创建类,类名首字母大写。
  2. 类里面有一个constructor函数,可以接收传递过来的函数,同时返回实例对象。
  3. 只要使用new生成实例时,就会调用constructor函数,如果我们不写这个函数, 类也会自动生成这个函数

 

3.5类中添加方法

//创建类
    class Star {
      //共有属性放在constructor中
      constructor(uname, age) {
        this.uname = uname;
        this.age = age;
      }
      sing(song) {
          //方法中可以this.使用实例属性
        console.log(this.uname + "会唱" + song);
      }
    }
    // 利用类实例化对象
    const ldh = new Star("刘德华", 19);
    const syz = new Star("孙燕姿", 18);
    //打印查看
    console.log(ldh);
    console.log(syz);
    ldh.sing("忘情水");
    syz.sing("遇见");
  

JS深入学习笔记 - 第二章.类和对象

 

注意:

  1. 类里面的所有函数(方法)不需要写function
  2. 多个函数方法(包括构造函数)之间不需要用 ',' 分割

4 类的继承

现实中的继承:子承父业,比如我们都继承了父亲的

程序中的继承:子类可以继承父类的一些属性方法

4.1使用extends关键字实现继承

 
   //创建父类类
    class Father {
      constructor(name, sex) {
        this.name = name;
        this.sex = sex;
      }
      money() {
        console.log(1000);
      }
    }
    // 创建子类并继承父类
    class children extends Father {
    }
    const oldestSon = new children("伯邑考", "男");
    const middleSon = new children("姬发", "男");
    son.money();

4.2super关键字

一个错误使用案例:

 
    class Father {
      constructor(x, y) {
        this.x = x;
        this.y = y;
      }
      total() {
        return this.x + this.y;
      }
    }
    class Son extends Father {
      constructor(x, y) {
        this.x = x;
        this.y = y;
      }
    }
    const son = new Son(1, 1);
    console.log("结果:" + son.total());

JS深入学习笔记 - 第二章.类和对象

 

此时希望调用父类中的构造函数则需要使用到super

    class Father {
      constructor(x, y) {
        this.x = x;
        this.y = y;
      }
      total() {
        return this.x + this.y;
      }
    }
    class Son extends Father {
      constructor(x, y) {
        super(x, y);
      }
    }
    const son = new Son(1, 1);
    console.log("结果:" + son.total()); //结果:2

 

思考:看到这里不知道你会不会和我有一样的困惑,此时没有super也可以实现 total方法的调用,所以 super存在真正的意义是什么呢

思考案例1:

 
    class Father {
      constructor(x, y) {
        this.x = x;
        this.y = y;
      }
      total() {
        return this.x + this.y;
      }
    }
    class Son extends Father {
    }
    const son = new Son(1, 1);
    console.log("结果:" + son.total());

JS深入学习笔记 - 第二章.类和对象

 

那么就让我们停下来思考一下:

当我们给Son构造函数传递多个参数的时候,这时,输出的结果就不是我们想要的结果了,此时就必须使用super才能传递正确的参数了。

思考案例2:

 
   class Father {
      constructor(x, y) {
        this.x = x;
        this.y = y;
      }
      total() {
        return this.x + this.y;
      }
    }
    class Son extends Father {
  
    }
    const son = new Son(1, "女", "zooey", 1);
    
    console.log("结果:" + son.total());//结果:1女

真正意义上:

利用Son类创建实例son时,我们将实例son的参数传递给Son类的构造函数,

构造函数通过super()调用Father构造函数从而给this.x,this.y赋值,

从而使Father类中的total的方法能够找到 this.x,this.y,

从而实现了思考案例1的结果。

JS深入学习笔记 - 第二章.类和对象

 

没有super时:

JS深入学习笔记 - 第二章.类和对象

 

super关键字用于访问和调用对象父类上的函数,可以调用父类的构造函数,也可以调用父类的普通函数。

super调用父类的方法

 
  class Father {
      constructor(x, y) {
        this.x = x;
        this.y = y;
      }
      total() {
        return this.x + this.y;
      }
    }
    
    class Son extends Father {
      constructor(x, y, z) {
        super(x, y);
        this.z = z;
      }
      total() {
        //子类方法中调用父类方法
        return this.z + super.total();
      }
    }
    const son = new Son(1, 1, 1);
    console.log("结果:" + son.total());//3

 

注意:子类的this赋值操作要放在super之后

JS深入学习笔记 - 第二章.类和对象

 

注意事项:

  1. 在 ES6 中类没有变量提升,必须先定义类,再实例化对象
  2. 类里面共有是属性和方法一定要加this使用
 
  class Star {
        constructor(name, age) {
          this.name = name;
          this.age = age;
          this.btn = document.querySelector("button");
          this.btn.onclick = this.sing;
        }
        sing() {
          console.log(this.name);
        }
      }
      const ldh = new Star("刘德华", 18);

 

4.3类中this指向

函数中的this一般指向调用者

下面的代码debug执行下,可以看到,sing()方法执行时,this是指向button的。

JS深入学习笔记 - 第二章.类和对象

 

那么正确的做法是什么呢?

 
      let _this;
      class Star {
        constructor(name, age) {
          _this = this;
          this.name = name;
          this.age = age;
          this.btn = document.querySelector("button");
          //注意:因为这里是点击之后再调用,不是立即执行,所以是sing不是sing()
          this.btn.onclick = this.sing;
        }
 
        sing() {
            //使用 _this
          console.log(_this.name);
        }
 
 
      }
      const ldh = new Star("刘德华", 18);

 

总结:全局声明一个this,然后调用后将它赋值给调用对象。

举一反三:react中,常用的另一个方法是使用bind绑定this文章来源地址https://www.toymoban.com/news/detail-709737.html

 
  class Star {
        constructor(name, age) {
          this.name = name;
          this.age = age;
          this.btn = document.querySelector("button");
          this.btn.onclick = this.sing.bind(this);
        }
 
        sing() {
          console.log(this.name);
        }
      }
      const ldh = new Star("刘德华", 18);

到了这里,关于JS深入学习笔记 - 第二章.类和对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rx.NET in Action 第二章学习笔记

    本章节涵盖的内容: 不使用Rx的工作方式 向项目中添加Rx 创建你的第一个Rx应用程序 Rx 的目标是协调和统筹来自社交网络、传感器、用户界面事件等不同来源的基于事件的异步计算。例如,建筑物周围的监控摄像头和移动传感器会在有人靠近建筑物时触发,并从最近的摄像头

    2024年02月12日
    浏览(26)
  • Windows高级调试(学习笔记)-第二章-调试器介绍

    2.1.1 Debugger Types调试器类型 User Mode Deduggers(用户态调试器) 实时调试(Living Debugging)、事后调试(Postmortem Debugging) 三个用户态调试器:cdb.exe、nstd.exe及windbg.exe Kernel Mode Debugger(内核态调试器) 可以分析计算机系统 二个内核态调试器:kd.exe及windbg.exe 2.1.2 Debugger Commands调试器命令 buil

    2024年01月18日
    浏览(54)
  • 《MetaGPT智能体开发入门》学习笔记 第一章第二章

    使用从 - 通过github仓库获取MetaGPT 代码拉下来后在config文件夹中配置chatGPT key 使用的python环境为3.9.2 metaGPT代码下载后在metagpt文件夹中找statup.py文件,运行以下命令,我是没有成功可能是chatgpt没钱 智能体 = LLM+观察+思考+行动+记忆 多智能体 = 智能体+环境+SOP+评审+路由+订阅+经

    2024年01月17日
    浏览(46)
  • Django学习笔记:第二章django的安装和创建应用

    终端运行 查看django是否安装成功 在控制台运行 在特定文件夹内打开终端运行 生成 进入上图的Scripts文件夹内,打开终端 先正常安装VSCode 再安装python插件 安装Django插件,搜索django,安装前两个 特点 功能完善,开发速度快,安全性强 有完善的在线文档 模型自带数据库ORM组件

    2024年02月16日
    浏览(37)
  • 【UnityShader入门精要学习笔记】第二章(2)GPU流水线

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 在上节笔记中,我们学习了图像渲染流水线的基本过程,从应用

    2024年02月22日
    浏览(33)
  • 【UnityShader入门精要学习笔记】第二章(1)了解渲染流水线

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 什么是流水线?书中举了一个生产洋娃娃的例子。一个洋娃娃的

    2024年01月25日
    浏览(32)
  • 《EDA技术实用教程(第六版(黄继业, 潘松))》学习笔记——第二章

    PLD(Programmable Logic Device):可编程逻辑器件 RAM(Random Access Memory):随机访问存储器 DRAM(Dynamic Random Access Memory):动态随机访问存储器 SRAM(Static Random Access Memory):静态随机访问存储器 ROM(Read-Only Memory):只读存储器 PROM(Programmable Read-Only Memory):可编程只读存储器

    2024年01月18日
    浏览(34)
  • Linux高性能服务器编程 学习笔记 第二章 IP协议详解

    本章从两方面探讨IP协议: 1.IP头部信息。IP头部出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,指定部分通信行为。 2.IP数据报的路由和转发。IP数据报的路由和转发发生在除目标机器外的所有主机和路由器上,它们决定数据报是否应

    2024年02月09日
    浏览(28)
  • 《Flink学习笔记》——第二章 Flink的安装和启动、以及应用开发和提交

    ​ 介绍Flink的安装、启动以及如何进行Flink程序的开发,如何运行部署Flink程序等 2.1 Flink的安装和启动 本地安装指的是单机模式 0、前期准备 java8或者java11(官方推荐11) 下载Flink安装包 https://flink.apache.org/zh/downloads/ hadoop(后面Flink on Yarn部署模式需要) 服务器(我是使用虚拟

    2024年02月10日
    浏览(29)
  • 【操作系统OS】学习笔记:第二章 进程与线程 (上)【哈工大李治军老师】

    基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记,仅进行交流分享 特此鸣谢李治军老师,操作系统的神作! 如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡𖥦)!! 主页专栏有更多,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持

    2024年02月02日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包