原型链和JSON

news2024/10/7 18:23:31

对象的封装、继承和多态

封装、继承和多态是面向对象编程的三大特征,在JavaScript中也可以使用这些特征来实现面向对象的的编程。

封装是指将对象的属性和方法封装在对象内部,只提供必要的接口给外部访问。封装可以让我们隐藏对象的实现细节,使得对象的行为看起来更加简单和清晰。

举例:我们有一个构造函数Person,他有一个私有属性age和一个公有方法getAge:

在这个例子中,我们通过将age定义为私有变量,并在getAge方法中访问它来实现封装。这样,外部的代码就无法直接访问age变量,只能通过getAge方法来获取它的值,这便是封装。

继承是指一个对象可以从另一个对象继承属性和方法。继承可以让我们避免重复定义相同的属性和方法,并且可以让我们扩展和修改继承来的属性和方法

举例:

在这个例子中,我们定义了一个构造函数Person和一个从他继承的构造函数Student。我们使用Object.create函数将Person.prototype赋值给Student.prototype,这样Student.prototype就成为了Person.prototype的原型。然后我们在Student.prototype上定义了一个新的方法getld。这样,所有从Student通过原型继承创建的对象都会继承Person.prototype中的方法sayHi和Student.prototype中的方法getld.

多态是指一个对象可以具有多种形态,即它可以在不同的情况下表现出不同的行为。多态可以让我们在不同的情况下使用同一个方法或属性,但是他会产生不同的结果。

例如,假设我们有一个抽象类Shape,他有一个抽象方法draw,然后有两个从他继承的类Circle和Rectangle,他们都实现了draw方法,但是实现不同:

在这个例子中,我们定义了一个抽象类Shape和两个从他继承的类Circle和Rectangle。我们在Circle类和Rectangle类中都重写了draw方法,这样他们在调用draw方法时会产生不同的结果。这就是多态的机制。

封装、继承和多态是面向对象编程中的三大基本特征。封装可以隐藏对象的实现细节,使得对象的行为看起来更加简单和清晰。继承可以让我们避免重复定义相同的属性和方法,并且可以让我们扩展和修改继承来的属性和方法。多态可以让我们在不同的情况下使用同一个方法或属性,但是他会产生不同的结果。

这些特征在JavaScript中也都可以使用,通过这些特征,我们可以在JavaScript中实现面向对象编程的概念,包括类、对象、继承、封装、多态等。

JavaScript原型对象

在JavaScript中,每个函数都有一个prototype属性,它指向一个对象,这个对象就叫做原型对象。通常,我们在函数的原型对象上定义方法和属性,这些方法和属性会被所有从这个函数通过原型继承创建的对象继承。

例如,假设我们有一个构造函数Person,他有一个原型对象Person.prototype,我们可以在原型对象上定义一个方法sayHi:

在这个例子中,我们在Person.prototype上定义了saiHi方法,然后通过new person('John')创建了一个名为john的对象。这个对象继承来Person.prototype的sayHi方法,所以我们可以在john对象上调用这个方法。

原型对象在JavaScript中是一个重要的概念,她是原型继承机制的基础。我们可以通过修改函数的原型对象来定义继承关系,并在原型对象上定义方法和属性,这些方法和属性会被所有从这个函数通过原型继承创建的对象继承。

JavaScript原型链

JavaScript原型链是一种对象继承机制,它使得一个对象可以从另一个对象继承属性,在JavaScript中,每个对象都有一个prototype属性,指向另一个对象,这个对象的属性可以被继承。

如果在一个对象上访问一个属性,JavaScript引擎会在这个对象的原型链上查找这个属性。如果在原型链上找不到这个属性,引擎会继续沿着原型链向上查找,直到找到位置。这就是原型继承的机制

举例:假设有一个原型对象Person和一个从他继承的对象Student,并且Person有一个属性name:

在这个例子中,Student继承了Person的sayHi方法,并定义了自己getld方法。如果我们在student对象上调用sayHi方法,JavaScript引擎会在student对象的原型链上查找这个方法,最终会在Person.prototype对象上找到他。如果调用student.sayHi(),JavaScript引擎会执行Person.prototype.sayHi函数,并将this绑定到student对象。所以,输出的是“Hi,my name is John"。

在JavaScript中,原型链是一种常用的继承机制,它可以让我们很方便地定义一个对象从另一个对象继承属性和方法。不过,原型链也有一些缺点,比如他不能很好地支撑多继承,并且它的实现机制有些复杂。在ES6中,JavaScript引入了新的继承机制,叫做类和继承,它可以让我们更方便地定义继承关系。https://es6.ruanyifeng.com

原型链污染

原型链污染指的是在原型对象上添加大量的属性或方法,这些属性和方法会被所有从这个原型对象通过原型继承创建的对象所继承。如果这些属性和方法的命名与其他库中的命名冲突,可能会导致意料之外的错误。

例如,假设我们有一个构造函数,他有一个原型对象Person.prototype,我们可以在原型对象上添加一个方法sayHi:

在这个例子中,我们在Person.prototype上定义了一个名为sayHi的方法,然后通过new Person('John')创建了一个名为John的对象。这个对象继承了Person.prototype的sayHi方法,所以我们可以在John对象上调用这个方法。

但是,假设我们现在从另一个库引入了一个同名方法sayHi,并将它赋值给Person.prototype。这样,所有从Person通过原型继承创建的对象都会继承这个新的sayHi方法,包括John对象。这就导致了原型链污染的问题,因为我们在原型对象上添加了一个与其他库中的同名方法冲突的方法。

为了避免这种情况,我们可以通过在原型对象上添加唯一的前缀来避免命名冲突,例如:

同添加了唯一前缀从而避免了原型链不会被污染。

JSON

JSON格式(JavaScript Object Notation的缩写)是一种用于数据交换的文本格式

每个JSON对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值.总之,只能是一个值,不能是多个值.

JSON的基本语法由键值对、对象和数组组成。下面是一个JSON样例,他表示了一个包含不同类型的数据对象

JSON对值的类型和格式有严格的规定

  1. 符合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象
  2. 原始类型的值只有四种:字符串、数值(10进制)、布尔值和null(不能使用NaN,Infinity,-/infinity和undefined)
  3. 字符串必须使用双引号表示,不能使用单引号。
  4. 对象的键名必须放在双引号里面
  5. 数组或对象最后一个成员的后面,不能加逗号
  6. JSON中不允许注释

示例:

JSON对象

JSON对象是JavaScript的原生对象,用来处理JSON格式数据。他有两个静态方法:

JSON.stringify()

JSON.parse()

JSON.parse()方法可以将JSON字符串转换成对应的值

但是如果我们传入的字符串不是有效的JSON格式,JSON.parse()方法将报错,但是为了可以解析错误,我们可以将JSON.parse()方法放在try … catch中。

select、poll、epoll

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

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

相关文章

项目管理:制定项目进度计划的好处有哪些?

项目管理计划确定了项目执行、监控及结束项目的整个过程,在项目开始之前,如能制定清晰的计划,并让项目成员都了解项目的目标和自己的责任,会对项目的推进有很大的帮助。 制定项目进度计划的好处有哪些? 1、目标导向…

高级树结构之二叉查找树

文章目录一 二叉查找树简介二 创建和插入操作三 查找操作3.1 查找思路3.2 代码实现四 删除操作4.1 情况讨论4.2 代码实现五 完整代码5.1 二叉查找树的结构5.2 完整代码内容一 二叉查找树简介 二叉查找树【二叉搜索树或是二叉排序树】 左子树中所有结点的值,均小于其…

(十一)devops持续集成开发——jenkins流水线发布一个docker harbor仓库版的前端vue项目

前言 本节内容,我们使用jenkins的流水线功能发布一个docker harbor私服仓库版的前端vue项目,延续前一节的内容,这里需要我们事先安装好一个docker harbor仓库用来存放我们项目的镜像,前端项目依然是通过nginx基础镜像构建&#x…

关于时间复杂度什么是时间复杂度

文章目录简介常见的Big-Oh简介 精确的考虑程序运行时间会使得寸步难行,而且毫无意义,所以可以用一种“概量”的概念来衡量运行时间,称之为“时间复杂度”。 时间复杂度的定义: 在一个完全立项状态下的计算机中,我们定…

【Sql Server】数据库的表变量和临时表的区别,并通过变量表随机生成姓名

作者:小5聊 简介:一只喜欢全栈方向的程序员,欢迎咨询,尽绵薄之力答疑解惑 公众号:有趣小馆,一个有趣的关键词回复互动功能 效果 1、表变量 1.1、表变量基本信息 1)表变量本质是一个变量 是SQ…

《啊哈算法》第一章典例+解析+代码

目录 一,计数排序 二,冒泡排序(Bubble Sort) 三,快速排序(Quick Sort) 四,桶排序(Bucket Sort) 五,小哼买书 从无到有掌握最基础的算法 多学…

react hooks 封装一个countDown 倒计时组件

开发技术 react , hooks , ts , taro 需求分析 需要一个可以按天,时,分和秒来进行倒计时的组件。 简单使用 注:主要逻辑请看 useCountDown import CountDown from /components/countDown; import { useEffect, useState } from react; i…

东宝商城项目(二)——flask-script模块、flask-migrate模块和项目日志配置

学习flask-script模块的使用 1、什么是flask-script flask-script是flask的一个扩展模块,Flask-Script的作用是可以通过命令行的形式来操作Flask。 2、安装flask-script pip install flask-script 3、flask-script的使用 例如有这样一种需求: 我们…

李彦宏开年定调“百度式创新”:反馈驱动,坚定技术

今天在百度热搜看到这么一条置顶话题,让我印象深刻:读懂中国经济的信心所在。 站在2023年起点,无论你是阳了、没阳,还是阳康了,之于个人、企业组织,都太需要信心和激励了。 点进去后是一篇来自《人民日报 …

小程序直播加速抢占电商流量先机

临近春节,到了购置年货的时候,相信有不少小伙伴被淘宝、拼多多、抖音等各大平台的直播卖货吸引。近年来,大家逐渐发现视频直播的影响力已经渗透到各行各业,通过直播带来的流量,不少商家赚得盆满钵满。视频直播这块流量…

Autosar MCAL-GPT配置及使用

文章目录前言GPTGptChannelConfigSetGptChannelIdGptChannelModeGptChannelTickFrequencyGptChannelTickValueMaxGptEnableWakeupGptNotificationGptChannelClkSrcRefGptAssignedHwUnitGptConfigurationOfOptApiServicesGptDeinitApiGptEnableDisableNotificationApiGptTimeEla…

系列33 Flow_Model

Introduction 在上一小节中讲到了Latent Variable Model(LAM),VAE。其主要思想就是将隐变量扩充为高维连续的分布,来增强模型的表达能力。而LAM模型中的核心困难是计算不出来,因为,而的维度过高算不出来。而…

GAN Step By Step -- Step7 WGAN

GAN Step By Step 心血来潮 GSBS,顾名思义,我希望我自己能够一步一步的学习GAN。GAN 又名 生成对抗网络,是最近几年很热门的一种无监督算法,他能生成出非常逼真的照片,图像甚至视频。GAN是一个图像的全新的领域&#…

2022 OceanBase 年度报告|用技术让海量数据的管理和使用更简单!

尊敬的各位客户、合作伙伴和开发者: 从 2020 年 6 月 1 日 OceanBase 开启商业化至今,我们一起走过了 900 多天。 从 0.5 到 3.x,我们花了近十年时间,而从 3.x 到 4.x 只用了不到两年,这是 OceanBase 和客户、伙伴、…

C++ 开发环境其实挺难搞的(上)

所谓工欲善其事,必先利其器,我将用两节课的内容向大家介绍 C 的开发工具及开发环境的一些知识。 Visual Studio 诞生至今已有 25 年以上的历史,功能强大,用的人非常多,社区的朋友戏称它为宇宙最强大的 IDE&#xff0c…

LeetCode 147. 对链表进行插入排序

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 147. 对链表进行插入排序,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 二、…

ECC原理和RocketChip Cache ECC实现

一、ECC原理说明ECC(Error Correcting Code)全称为错误纠正码,用于对存储器的数据进行完整性检查和纠正,主要用在SRAM、DDR、NAND等存储器设备上。ECC可以对数据进行单比特的纠错和多比特的检错,其原理基于汉明码编码而来。下图是ECC编码的主…

如何通过光耦合器连接继电器

如何通过光耦合器连接继电器 介绍 以下文章介绍如何使用隔离方法或通过光耦合器器件驱动继电器。我们将学习三种方法,第一种方法是将继电器直接连接到光耦合器输出引脚,第二种方法是使用外部PNP晶体管,第三种方法是使用外部NPN晶体管。任何…

二十九、Docker (5)

🌻🌻 目录一、Maven Docker 插件构建 Docker 镜像1.1 maven Docker 插件构建 Docker 镜像入门1.2 maven Docker 插件构建 Docker 镜像,自定义 DockerFile1.3 maven Docker 插件构建并推送镜像到 Docker 私有仓库二、手动发布部署微服务项目到…

类与对象(三):stactic成员、友元、内部类

类与对象(三)1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字2. static成员2.1 概念特性类中成员变量区别(普通变量和static变量):普通成员函数和静态成员函数的区别3. 友元友元函数友元类cout打印自定义类型…