JavaScript对象 (八):对象类型的使用、值类型和引用类型、函数的this指向、工厂方法创建对象、构造函数和类、new创建对象

news2024/9/24 11:31:56

1. 对象类型的使用

1.1 认识对象类型

基础数据类型可以存储一些简单的值,但是现实世界的事物抽象成程序时,往往比较复杂。

  • 比如一个人,有自己的特性(比如姓名、年龄、身高),有一些行为(比如跑步、学习、工作)
  • 比如一辆车,有自己的特性(比如颜色、重量、速度),有一些行为(比如行驶)

在这里插入图片描述

  • 对象类型:是一种存储键值对(key-value)的更复杂的数据类型,我们需要使用对象类型将特性和行为组织到一起
    1. {……}创建,里面包含键值对"key: value"
    2. 键值对可以是属性和方法(在对象中的函数称之为方法)
    3. 其中key是字符串(也叫做属性名property name ,ES6之后也可以是Symbol类型,后续学习),但是在定义对象的属性名时, 大部分情况下引号都是可以省略的
    4. 其中value可以是任意类型,包括基本数据类型、函数类型、对象类型等
/*
      两个术语: 函数/方法
         函数(function): 如果在JavaScript代码中通过function默认定义一个结构, 称之为是函数.
         方法(method): 如果将一个函数放到对象中, 作为对象的一个属性, 那么将这个函数称之为方法.
    */
    function foo() {
    }

    // key: 字符串类型, 但是在定义对象的属性名时, 大部分情况下引号都是可以省略的
    var person = {
      // key: value
      name: "why",
      age: 18,
      height: 1.88,
      "my friend": {
        name: "kobe",
        age: 30
      },
      run: function() {
        console.log("running")
      },
      eat: function() {
        console.log("eat foods")
      },
      study: function() {
        console.log("studying")
      }
    }

1.2 创建对象

  • 对象的属性用逗号,分隔

  • 对象的创建方法有很多,包括三种:

    1. 对象字面量(Object Literal):通过{ }
      在这里插入图片描述

    2. new Object + 动态添加属性
      在这里插入图片描述

    3. new 其他类 构造函数
      在这里插入图片描述

1.3 对象的常见操作

// 1.定义了一个对象
    var info = {
      name: "why",
      age: 18,
      friend: {
        name: "kobe",
        age: 30
      },
      running: function() {
        console.log("running~")
      }
    }

  1. 访问对象的属性
    在这里插入图片描述

  2. 修改对象的属性
    在这里插入图片描述

  3. 添加对象的属性
    在这里插入图片描述

  4. 删除对象的属性
    在这里插入图片描述

1.4 方括号和引号的使用

在对象中属性名(键)是字符串类型,但是在定义对象的属性名时, 大部分情况下引号都是可以省略的。当我们用点符号去访问多词属性,JavaScript是无法理解的。

在这里插入图片描述

访问对象的两种方式

  1. 对象名.属性名
    • 点符号要求 key 是有效的变量标识符
    • 并且不包含空格不以数字开头也不包含特殊字符(允许使用 $ 和 _ )
  2. 对象名["属性名"]
    • 中括号访问键名时需要搭配引号访问,即字符串 ,也可以放入值为字符串的变量名
    • 方括号的操作在定义或者操作属性时更加的灵活
      在这里插入图片描述

1.5 对象的遍历

对象的遍历(迭代):表示获取对象中所有的属性和方法。

遍历对象的方法

  1. 普通for循环:主要用到该方法,Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组。

    // 1.普通for循环
        var infoKeys = Object.keys(info)
        for (var i = 0; i < infoKeys.length; i++) {
          var key = infoKeys[i]
          var value = info[key]
          console.log(`key: ${key}, value: ${value}`)
        }
    
  2. for in 遍历方法:

    // 2.for..in..: 遍历对象
        for (var key in info) {
          var value = info[key]
          console.log(`key: ${key}, value: ${value}`)
        }
    

2. 值类型和引用类型

2.1 栈内存和堆内存

  • 我们知道程序是需要加载到内存中来执行的,我们可以将内存划分为两个区域栈内存和堆内存
    • 原始类型占据的空间是在栈内存中分配的
    • 对象类型占据的空间是在堆内存中分配的

在这里插入图片描述
备注:目前我们先掌握堆和栈的概念即可,后续我们会学习图中的其他知识

在这里插入图片描述

2.2 值类型和引用类型

  1. 原始类型也被称之为值类型:即在变量中保存的是值本身
    在这里插入图片描述

  2. 以对象类型也被称之为引用类型:在变量中保存的是对象的“引用”,即地址
    在这里插入图片描述

2.3 五种典型现象

  1. 现象一: 两个对象的比较
    在这里插入图片描述

  2. 现象二: 引用的赋值
    在这里插入图片描述

  3. 现象三: 值传递
    在这里插入图片描述

  4. 现象四: 引用传递, 但是在函数中创建了一个新对象, 没有对传入对象进行修改
    在这里插入图片描述

  5. 现象五: 引用传递, 但是对传入的对象进行修改
    在这里插入图片描述

3. this 关键字

3.1 为什么需要this

  • 在常见的编程语言中,几乎都有this关键字,但是在JavaScript中的this和常见的面向对象语言中的this不太一样
    • 常见面向对象的编程语言中,比如Java、C++、Swift、Dart等等一系列语言中,this通常只会出现在类的方法中,首先需要有一个类,类中的方法(特别是实例方法)中,this代表的是当前调用对象
    • JavaScript中:this更加灵活,无论是它出现的位置还是它代表的含义,下面我们开始了解JavaScript中this的指向

我们来看一下编写一个obj的对象,有this和没有this的区别:
在这里插入图片描述

3.2 函数中this的指向

函数中是有一个this的变量, this变量在大多数情况下会指向一个对象,我们也知道除了this外,还有一个arguments对象保存传入的所有参数

目前掌握两个this的判断方法
1. 在全局环境下,this指向window

// 情况一: 如果普通的函数被默认调用, 那么this指向的就是window
    // function foo(name, age) {
    //   console.log(arguments)
    //   console.log(this)
    // }
    // foo("abc", 123)

    function sayHello(name) {
      console.log(this)
    }

    sayHello()  //window
  1. 通过对象调用,this指向调用的对象
 // 情况二: 如果函数它是被某一个对象来引用并且调用它, 那么this会指向这个对象(调用的那个调用)
    var obj = {
      name: "why",
      running: function() {
        console.log(this)
        // console.log(obj)
        // console.log(this === obj)
      }
    }
    obj.running() //obj

this指向练习题:

var obj = {
      name: "why",
      running: function() {
        console.log(this)
        // console.log(obj)
        // console.log(this === obj)
      }
    }
    obj.running() //obj

    // 考验题目
    // 1.题目一:
    var fn = obj.running
    fn() // window

    // 2.题目二:
     function bar() {
      console.log(this)
    }
    var obj = {
      name: "why",
      bar: bar
    }
    obj.bar()// obj对象
    bar()// window对象

3.3 this在开发中的作用

当我们的对象中的方法执行是,需要一些参数,如果我们有很多方法都需要参数,那我们手动的去一个个添加是很麻烦的。
在这里插入图片描述

我们可以利用this的特性,即通过对象调用,指向的是调用的对象,即可以从对象中取值
在这里插入图片描述

4. 类和对象

4.1 类和对象的思维方式

  • 如果需要在开发中创建一系列的相似的对象,我们应该如何操作呢?比如:
    • 游戏中创建一系列的英雄(英雄具备的特性是相似的,比如都有名字、技能、价格,但是具体的值又不相同)
    • 学生系统中创建一系列的学生(学生都有学号、姓名、年龄等,但是具体的值又不相同)

4.2 创建对象的方案

  1. 方案一(不可行) :直接创建一系列的对象
    在这里插入图片描述

  2. 方案二 工厂函数:我们可以封装一个函数,这个函数用于帮助我们创建一个对象,我们只需要重复调用这个函数即可,工厂模式其实是一种常见的设计模式

在这里插入图片描述

分析:工厂方法创建对象有一个比较大的问题:我们在打印对象时,对象的类型都是Object类型,我们希望从某些角度来说,创建的对象应该他有一个他们共同的类型,因此,我们需要看一下另外一种模式:构造函数的方式

  1. 通过工厂函数创建的对象:因为{}默认时是通过new Object()生成的空对象,Object也是一个构造函数或类
    在这里插入图片描述
  2. 通过构造函数创建的对象
    在这里插入图片描述

4.3 认识构造函数

构造函数(也称 构造器 constructor): 我们通过调用构造函数来创建对象,在其他编程语言中,构造函数是存在于类中的一个方法,称之为构造方法。但是在JavaScript中的构造函数有点不一样,构造函数其实就是类的扮演者

  • 在ES5之前,我们都是通过function来声明一个构造函数(类)的,之后通过new关键字来对其进行调用
  • 在ES6之后,JavaScript可以像别的语言一样,通过class来声明一个类

像之后我们会学到内置对象,也可以称内置类,比如像系统默认给我们提供的Date就是一个构造函数,也可以看成是一个类

4.4 类和对象的关系

  • 现实生活中:我们往往是根据一份描述/一个模板创建一个实体对象的,比如水果是统称,而苹果、橘子、葡萄等是具体的对象。
  • 编程语言中也是一样: 首先必须有一份描述, 在这份描述中说明将来创建出来的对象有哪些属性(成员变量)和行为(成员方法)
    在这里插入图片描述

4.5 构造函数的使用

需要使用 this关键字 以及 new关键字

  • 在函数中的this一般指向某一个对象
  • 如果一个函数被new操作符调用
    1. 在内存中创建一个新的对象(空对象);
    2. 这个对象内部的[[prototype]]属性会被赋值为该构造函数的prototype属性 (后续了解)
    3. 构造函数内部的this,会指向创建出来的新对象
    4. 执行函数的内部代码(函数体代码)
    5. 如果构造函数没有返回非空对象,则返回创建出来的新对象
    function coder(name, age, height) {
          this.name = name
          this.age = age
          this.height = height
          this.running = function() {
            console.log("running~")
          }
        }
    
        // 在函数调用的前面加 new 关键字(操作符)
        var stu1 = new coder("why", 18, 1.88)
        var stu2 = new coder("kobe", 30, 1.98)
        console.log(stu1, stu2)
    

接下来,我们可以用构造函数的方式来实现一下批量创建学生。

4.5 构造函数(类)的总结

我们前面说过,在JavaScript中类的表示形式就是构造函数。

构造函数与普通函数的区别

  • 构造函数也是一个普通的函数,从表现形式来说,和千千万万个普通的函数没有任何区别
  • 如果这么一个普通的函数被使用new操作符来调用了,那么这个函数就称之为是一个构造函数

构造函数与普通函数的命名:在ES5之前为了区分构造函数和普通函数我们一般这么操作

  • 构造函数:使用大驼峰命名
  • 普通函数:使用小驼峰命名
 // 创建一系列的对象
    // 构造函数的名称: 使用大驼峰
    function Person() {

    }
    // 普通函数: 使用小驼峰
    function sayHello() {

    }

    // 构造函数创建对象
    var p1 = new Person()
    console.log(p1)

    // 平时创建普通的对象
    // new Object()
    var obj1 = {}
    var obj2 = new Object()
    var obj3 = new Person()

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

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

相关文章

课程17:菜单管理功能实现

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

为什么运行时安全性重新流行起来?

容器通过以更高效和可扩展的方式创建、打包和部署应用程序&#xff0c;彻底改变了软件开发过程。 然而&#xff0c;能力越大&#xff0c;责任越大&#xff0c;对“左移安全性”的高度关注为那些在运行时忽视安全性的组织带来了风险。 通过对容器运行时安全采取多层次、全面的…

云服务器ECS_云主机_服务器托管_弹性计算-阿里云

阿里云服务器ECS&#xff08;Elastic Compute Service&#xff09;是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云服务器网分享阿里云服务器ECS详细介…

Linux文件操作四剑客

目录 一、grep &#xff08;一&#xff09;作用 &#xff08;二&#xff09;格式 &#xff08;三&#xff09;选项 &#xff08;四&#xff09;案例 1、查看/etc目录下所有包含bash的文件名&#xff1a;grep -rl bash /etc 2、查看/var/log目录下所有包含error的文…

读发布!设计与部署稳定的分布式系统(第2版)笔记04_集成点

1. 第一个拥有10亿用户的网站 1.1. 2016年&#xff0c;Facebook宣布其每日活跃用户数量为11.3亿 1.2. 对整个应用程序来说&#xff0c;“五个9”的可靠性远远不够&#xff0c;这每天会让成千上万的用户失望 1.3. 假如按照六西格玛质量标准来衡量&#xff0c;那么Facebook每天…

LIN-网络管理:休眠(Go To Sleep)和唤醒(Wake up)

文章目录 一、LIN总线的两种状态二、休眠模式&#xff08;Go To Sleep&#xff09;①利用诊断帧中的主机请求帧 0x3C 作休眠命令②当总线静默(没有显性和隐性电平之间的切换)4s&#xff5e;10s 时&#xff0c;节点自动进入休眠状态。 三、唤醒模式&#xff08;Wake up&#xff…

智能图片降噪-Topaz Photo AI

今天给各位小伙伴们测试了一款可以使视频智能无损放大的软件——Topaz Photo AI。 小编在很早之前也有了解过Topaz系列的软件&#xff0c;都是通过人工智能处理的&#xff0c;对小白新手们很适用&#xff0c;由于使用人工智能方面的软件或程序对硬件要求都比较高&#xff0c;因…

交通指南系统

一、实验目的 1. 掌握图的基本存储方法&#xff1b; 2. 掌握有关图的操作算法并用高级语言实现&#xff1b; 3. 熟练掌握图的两种搜索路径的遍历方法。 二、实验内容 假设以一个带权有向图表示某一区域的公交线路网&#xff0c;图中顶点代表一些区域中的重要场所&#xff0…

设计模式(二十二):行为型之备忘录模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

【C】转义字符以及注释的介绍

转义字符 转义字符顾名思义就是转变意思。就是把原来字符的意思转变了&#xff0c;让它拥有别的意思。 如果我们想要在屏幕上打印&#xff1a;c:\code:\test.c 这样一串文字的话&#xff0c;我们代码肯定会这样写&#xff1a; #include<stdio.h> int main() {printf(&q…

压缩感知入门④基于总体最小二乘的扰动压缩感知重构算法

压缩感知系列博客&#xff1a;压缩感知入门①从零开始压缩感知压缩感知入门②信号的稀疏表示和约束等距性压缩感知入门③基于ADMM的全变分正则化的压缩感知重构算法压缩感知入门④基于总体最小二乘的扰动压缩感知重构算法 文章目录 1. Problem2. 仿真结果3. MATLAB算法4. 源码地…

Bean 的六种作用域

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8) 前端使用VSCode(Visual Studio Code1.78.2) 电脑使用的操作系统版本为 Windows 10 目录 前言 Bean Spring 容器在初始化⼀个 Bean 的实例时&#xff0c;同时会指定该实例的作⽤域。 1. …

chatgpt赋能python:Python怎样能通过值找到键

Python怎样能通过值找到键 Python是一种高级编程语言&#xff0c;它在工业、医疗、科学、财务等多个行业中被广泛使用&#xff0c;是数据科学、人工智能和深度学习等领域的首选语言。在Python编程中&#xff0c;有时候我们需要在字典中根据值查询对应的键&#xff0c;本文将介…

chatgpt赋能python:Python排序算法大全

Python排序算法大全 导言 排序是程序员日常工作中最常见的操作之一。Python提供了许多实现排序算法的库和函数&#xff0c;本文将带您了解这些排序方法。 初级排序算法 冒泡排序 Bubble Sort 冒泡排序是一种简单的排序算法。它通过不断交换相邻的元素&#xff0c;将大的元…

【微服务架构设计和实现】4.2 服务边界的定义和划分

第一章&#xff1a;【云原生概念和技术】 第二章&#xff1a;【容器化应用程序设计和开发】 第三章&#xff1a;【基于容器的部署、管理和扩展】 第四章&#xff1a;【4.1 微服务架构概述和设计原则】 4.2 服务边界的定义和划分 4.2 服务边界的定义和划分4.2.1 什么是服务边…

docker创建Ubuntu,Ubuntu创建桌面环境,本机使用VNC连接

题目&#xff1a;docker创建Ubuntu&#xff0c;Ubuntu创建桌面环境&#xff0c;本机使用VNC连接 文章目录 前言docker创建基于Ubuntu:20.04的容器使用ssh连接容器容器安装桌面环境本机电脑使用VNC连接测试用python来创建的ui能否显示坑参考 前言 为什么我想要用ubuntu的桌面环…

RFID课程要点总结_2 Identification

2. Identification 简单说RFID就是物体上贴tag&#xff0c;用reader上的antenna去读取&#xff0c;这三个是主要组成。 Reader’s function Energy supply: 比如有的标签自身不带能量需要reader提供信号中蕴含的能量 Communication: 最基本的功能&#xff0c;和tag识别&…

Flink CDC、OGG、Debezium等基于日志开源CDC方案对比

先上一张图&#xff0c;后面再慢慢介绍&#xff1a; CDC概述 CDC 的全称是 Change Data Capture &#xff0c;在广义的概念上&#xff0c;只要能捕获数据变更的技术&#xff0c;我们都可以称为 CDC 。我们目前通常描述的CDC 技术主要面向数据库的变更&#xff0c;是一种用于捕…

56、基于51单片机智能医院红外点滴检测输液器报警系统设计(程序+原理图+PCB源文件+参考论文+参考PPT+元器件清单等)

引 言 目前&#xff0c;国际上每年每人的静脉输液量平均为2.5-3.3瓶&#xff0c;就我国而言&#xff0c;每年每人平均输液量8瓶&#xff0c;总量超过100亿瓶&#xff0c;其中每年约有39万人死于输液不良反应 。在如今新冠肺炎疫情持续的情况下&#xff0c;静脉输液仍是临床医学…

chatgpt赋能python:Python中如何选取list13列

Python中如何选取list 1 3列 介绍 对于SEO优化来说&#xff0c;选取适当的数据是至关重要的一步。Python是一门强大的编程语言&#xff0c;可以帮助人们快速而准确地处理数据&#xff0c;进而选择最佳数据进行SEO。在Python中&#xff0c;我们可以使用一些简单的方法来选择li…