【Javascript】面向对象编程,this,原型与原型链,类与实例

news2024/11/24 11:31:25

❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:

文章目录

  • 对象中的方法/this
    • this使用
    • bind函数
  • 原型
    • 原型链
  • 类与实例
    • class

对象中的方法/this

  • 面向对象:核心思想就是可以为每种事务(东西),在编程语言中建立一个对应的类型,对应到语言里就是一个class
  • 反引号:中间可以插入${}作为动态字符串
  • 其实对象中函数的调用就是方法,foo和bar就当作obj对象的方法调用
  • 其中foo的this就是指代的obj对象,bar的this指代的也是obj这个对象
<script>
  obj = {
    foo: function () { },
    bar: function () { },
  }

  let rabbit = {}
  rabbit.speak = function (line) {
    console.log(`the rabbit says ${line}`)
  }
</script>

this使用

  • this是函数的一个隐含参数,其值不是传入的,而是取决于该函数的调用方式,不取决于函数在哪定义和在哪调用
  • f() = obj.foo
    f() // 当函数调用,里面的this指向window
    obj.foo() //当obj的方法调用,里面的this指向obj
    他们两个的this是不同的
  • 这个this指代的是添加的属性对应的对象
<script>
  a = [1, 2, 3]
  a.push2 = function (val) {
    this[this.length] = val
    return this.length	
  }
   a.forEach2 = function (action) {
   for (var i = 0; i < this.length; i++) {
     action(this[i])
   }
</script>
  • 这个speak是对象属性的简写,speak属性来源于能够读到的一个speak函数的变量名
    -

  • js语言中,函数从来不属于一个对象,this也不会因为这种属于而一成不变

  • 在js中,如果两个对象分别有一个属性指向同一个函数,则该函数和这两个对象之间的关系是对等的

<script>
  function speak(line) {
    console.log(`the ${this.type} rabbit says ${line}`)
  }

  let whiteRabbit = {
    type: "white",
    speak
  }
  let hungryRabbit = {
  	type : "hungry",
  	speak
  }
  speak.call(hungryRabbit,"woshizhu")
</script>
  • 在call方法和apply方法中,第一个参数传的就是this,call和apply唯一的区别就是第二个参数apply传的是数组,而call后面传的是一个一个的参数,由此来看apply更好用一些,因为如果数组可以是一个变化的值,而call的话只能是传固定的参数
    在这里插入图片描述
  • 所以,如果一个函数中创建了另一个函数,那么内层函数是拿不到外层函数的this的,除非是外层函数通过call方法,把外层函数的this和内层函数指向同一个函数
  • this不能出现在等号的左边,即this本身不能被赋值,this的绑定关系不能被改变。
  • 箭头函数是没有this的,在箭头函数里读this,就跟在读一个箭头函数内部没有声明的变量一样。读箭头函数的this,就是读箭头函数外面函数的this
  • 由于call/apply并不能改变箭头函数里的this,所以一般都不会使用call和apply来调用箭头函数。apply传不定数量参数的功能由展开运算符。。。来提供。

bind函数

  • bind函数的第一个参数是绑定this,如果bind的this已经被绑定了,那么就不能再次更改绑定了
    在这里插入图片描述

原型

在这里插入图片描述

  • 从这里我们可以看到,js从一个空对象里取出了一个属性;如果你在一个对象上找不到对应的属性,就会在这个原型对象上找,原型就相当于是一个后备源;所以任何一个对象都有toString的方法,这个方法就是在原型上的
  • Object.getPrototypeOf({})这个可以获得对象的原型,object.prototype这个是获取object上的一个属性,这个属性指向原型对象,所以他俩是相等的;数组的原型的原型是对象的原型;最终Object.getPrototypeOf(Object.getPrototypeOf({}))的原型是null
  • Object.getPrototypeOf([]) === Array.prototype
  • Object.getPrototypeOf(function(){}) === Function.prototype
  • Array.prototype和Function.prototype都以Object.prototype为原型
    在这里插入图片描述
    在这里插入图片描述
  • 这个双中括号phototype就是原型,双中括号代表对象的内部的状态
  • 如果想要看到函数的内部状态,用console.dir()
    在这里插入图片描述
    在这里插入图片描述
  • 还有一点就是不会因为给一个对象的属性赋值而赋值到其原型对象上

原型链

  • js就是通过原型链的方式实现了面向对象的
  • 原型链在js中其实也只是指针(对象的指向关系 )
  • 原型链存在的作用一方面是为了继承,另一方面是为了节省空间;如果一组对象都想有某些方法/属性,则把这些共用的方法/属性放到它们的原型上,可以节省存储空间

在这里插入图片描述

类与实例

  • 补充一个语法:当在对象的属性中,一个属性指向一个函数(必须是function函数),可以直接将冒号和function删除
    在这里插入图片描述
  • 怎样自己创建原型对象呢?通过Object.create(xxx)
    在这里插入图片描述

class

  • class就是定义了一个类型,构造函数就是一个所有的基础
<script>
  var protoRabbit = {
    speak(line) {
      console.log(`the ${this.type} rabbit says ${line}`)
    }
  }

  function makeRabbit(type) {
    let rabbit = Object.create(protoRabbit)
    rabbit.type = type
    return rabbit
  }

  var killRabbit = makeRabbit('killer')
  var yellowRabbit = makeRabbit('yellowRabbit')
</script>
  • 这样写等价于上面那么写,更加方便
  • 原型里面就写一些基础的公共方法,然后构造函数就传值,然后用new创建对象
<script>
  function Rabbit(type) {
    this.type = type
  }

  Rabbit.prototype = {
    speak(line) {
      console.log(`the ${this.type} rabbit says ${line}`)
    }
  }
new Rabbit(yellow);
</script>

在这里插入图片描述

  • 构造函数的prototype属性 仅仅是作为其构造出来的实例的原型;其实所有的普通函数(非箭头函数)都有prototype属性,但我们一般只关心构造函数的prototype属性
  • 除了undifined和null,任何值都有原型,即_ proto 属性, proto _属性就是原型,要区别于原型和构造函数的原型属性
    也就是说Object.getPrototypeOf(Rabbit) == Function.prototype
    在这里插入图片描述
  • 上面的那个叫原型属性,下面的那个叫原型,一般如果是构造方法的话,我们就设置上面的那个,也就是设置所谓的原型属性

————————————————————————
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】小王带您实现文件操作(简单图示讲解)

说到文件操作&#xff0c;大家会第一印象想到不就是电脑硬盘中创建文件&#xff0c;写入数据吗&#xff0c;键盘、鼠标就可以搞定&#xff0c;那么接下来我要告诉你的是C语言也可以实现文件操作哦&#xff01;&#xff01;&#xff01; 目录 前言 一、为什么要使用文件操作 …

模拟卷.C

1.分支_sine之舞 样例输入 3 样例输出 ((sin(1)+3)sin(1-sin(2))+2)sin(1-sin(2+sin(3)))+1 2.数组_和最大子序列 样例输入 5 3 -2 3 -5 4 样例输出 4 3.二维数组_星辰大海 样例输入 2 2 S. #T 2 RD DR 3 S.# .#. .T# 3 RL DDD DDRR 样例输出 I get …

文档管理系统采用电子签名的优势

DocuWare文档管理系统始终提供最高级的安全性&#xff0c;保护我们客户的机密文件和数据。 现在&#xff0c;我们与信任服务提供商ValidatedID 集成&#xff0c;电子签名又向前迈出了重要的一步。每当组织需要证明签名是真实的并确保文档未被更改时&#xff0c;都可以使用这些…

开源mybatis神器

什么是通用 Mapper&#xff1f; 它是一个可以方便的使用 Mybatis 进行单表的增删改查优秀开源产品。它使用拦截器来实现具体的执行 Sql&#xff0c;完全使用原生的 Mybatis 进行操作。在 Github 上标星 5.9K&#xff01; 为什么要用 Mapper&#xff1f; 它提供了所有单表的基…

《SQL基础》07. 约束

SQL-约束约束常见约束案例外键约束删除/更新行为约束 概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确性、有效性和完整性。 分类&#xff1a; 约束描述关键字非空约束限制该字段的数据不能为n…

动态内存管理(2)

TIPS 1. scanf读取与空格&#xff1a; 我们都知道&#xff0c;scanf()在从输入缓冲区里面读取数据的时候&#xff0c;如果中间碰到了空格&#xff0c;那么就会直接停下来&#xff0c;而如果在最前面有个空格&#xff0c;直接无视空格。 2. scanf()读取与\n&#xff0c;如果是…

【论文精选】TPAMI2020 - PFENet_先验引导的特征富集网络_小样本语义分割

【论文精选】TPAMI2020 - PFENet_先验引导的特征富集网络_小样本语义分割 精选精析&#xff1a; 【论文原文】&#xff1a; Prior Guided Feature Enrichment Network for Few-Shot Segmentation (当前引用次数&#xff1a;184) 【论文代码】&#xff1a; https://github.co…

【爪洼岛冒险记】第5站:多图解,超详细讲解Java中的数组、二维数组--建议收藏

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01; &#x1f4dc;所属专栏&#xff1a;爪洼岛冒险记【从小白到大佬之路】 ✈往期博文回顾: 【爪洼岛冒险记】…

【GD32F427开发板试用】RT-THREAD标准版 移植使用

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;打盹的消防车 前言&#xff1a; 无意在微信看到了GD做活动&#xff0c;想到了第一时间体验一下&#xff0c;搭配RT-THREAD&#xff0c;也很方…

【Java】【系列篇】【Spring源码解析】【三】【体系】【BeanDefinition体系】

整体结构图 1. BeanDefinition 用于保存 Bean 的相关信息&#xff0c;包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等&#xff0c; 它是实例化 Bean 的原材料&#xff0c;Spring 就是根据 BeanDefinition 中的信息实例化 Bean。 2. 我们获取对象的方式一般有…

AioDnsBrute:一款功能强大的异步DNS爆破工具

关于AioDnsBrute AioDnsBrute是一款功能强大的异步DNS爆破工具&#xff0c;该工具基于Python 3.5开发&#xff0c;并使用了asyncio库以实现针对目标域名的异步爆破。 该工具的运行速度非常快&#xff0c;在一台小型VPS主机上&#xff0c;可以实现在1.5-2分钟之内处理大约10万…

【计数DP】P4933 大师

这道是洛谷官方题单的简单DP为啥我放上来呢&#xff0c;因为我因为各种各样的细节原因没做出来感觉计数的DP有点点难&#xff0c;得多写了P4933 大师 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)题意&#xff1a;思路&#xff1a;第一眼肯定是设dp[i][j]为以a[i]为结尾&…

8. 【Redisson源码】分布式信号量RSemaphore

目录 一、RSemaphore的使用 二、RSemaphore设置许可数量 三、RSemaphore的加锁流程 四、RSemaphore的解锁流程 【本篇文章基于redisson-3.17.6版本源码进行分析】 基于Redis的Redisson的分布式信号量RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。 …

从首个「数实融合」公益球场,看元宇宙奏响创新「三重奏」

作者 | 曾响铃 文 | 响铃说 2022年的元宇宙&#xff0c;一半是海水&#xff0c;一半是火焰。 一边是刮起元宇宙热潮的Roblox股价跌去大半&#xff0c;Meta也因元宇宙亏损深陷泥潭。另一边&#xff0c;经过2021年元宇宙概念落地和普及&#xff0c;2022年却也是元宇宙相关产业…

分享86个PHP源码,总有一款适合您

PHP源码 分享86个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 86个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1fsoGdkr_-wZUaJvVMOlihQ?pwdlhyo 提取码&#xff…

Java 泛型是什么?一文带你吃透泛型

文章目录1. Java 泛型2. 泛型类3. 泛型接口4. 泛型方法5. 泛型集合Java编程基础教程系列1. Java 泛型 Java 泛型是 JDK1.5 中引入的一个新特性&#xff0c;其本质是参数化类型&#xff0c;把类型作为参数传递。其主要的形式有泛型类&#xff0c;泛型接口和泛型方法。泛型概念的…

sqoop安装(linux)

一、前期准备安装好hadoop伪分布安装好MySQL下载sqoop压缩文件实验环境&#xff1a;实验环境版本CentOS 6.5MySQL5.7.37hadoop3.3.0sqoop1.4.7sqoop1.4.7 下载链接&#xff1a;https://pan.baidu.com/s/16AUdtBmSv7OG2PTyA1XcgQ?pwdqu7lmysql驱动包下载地址&#xff1a;https:…

易于设置的倒计时页面Easy countdown

今天开始放假了 什么是 Easy countdown &#xff1f; Easy countdown 是一个易于设置的倒计时页面。可以设置为倒计时或计时器。 先看看官方提供的动图 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 easy-countdown &#xff0c;选择第一个 yooooomi/easy-countdown&am…

【前端学习指南】基础开发环境搭建

&#x1f36d; Hello&#xff0c;我是爱吃糖的范同学 邻近春节&#xff0c;虽然学校的事情已经处理的差不多了&#xff0c;又开始要忙着找实习......时间安排上还是有很多问题&#xff0c;希望大家多多包涵&#xff0c;我已经加班加点在写作了&#x1f602;&#x1f602;&…

高盐废水如何处理,离子交换树脂在高盐废水中的应用

什么是高盐废水&#xff1f; 高盐废水是工业废水中较常见的一种&#xff0c;它是指总含盐量(以NaCl计&#xff09;至少为1%的废水&#xff0c;属于难处理的废水之一。 高盐废水中的总溶解固体物TDS&#xff0c;多在10000-25000mg/L&#xff0c;含盐成分复杂&#xff0c;有Na、…