对象及原型链

2023-10-29


本文仅为前端初学者整理知识点,不做他用。

面向对象的三大特性

  • 封装
  • 继承
  • 多态

原型链

原型链是面向对象的基础,主要从以下几方面入手:

  • 创建对象的几种方法
  • 原型、构造函数、实例、原型链
  • instanceof的原理
  • new运算符

创建对象的方法

  1. 字面量

var obj11 = {name:“莉莉”};
var obj12 = new Object(name:“莉莉”);//内置对象的构造函数

以上两种写法得到的结果一样,第一种是字面量方式,第二种是内置的构造函数。

  1. 通过构造函数

var Person = function(name){
this.name = name;
}
var obj2 = new Person(‘莉莉’);

  1. Object.create

var person = {name:‘莉莉’};
var obj3 = Object.create(person);

在这种方式里,obj3是实例,person是obj3的原型,name是person原型里的属性,Object是构造函数。

  • var a = {} 其实是 var a = new Object()的语法糖;
  • var a = [] 是 var a = new Array()的语法糖;
  • function Foo(){…}其实是var Foo = new Function(…);
  • 使用instanceof可以判断一个函数是否是一个变量的构造函数;

原型、构造函数、实例、原型链

转载自网络,侵权联系删除。
任何一个函数,如果在前面加了new,那它就是构造函数。

原型、构造函数、实例三者之间的关系

转载自网络,侵权联系删除。

  1. 构造函数通过new生成实例
  2. 构造函数也是函数,它的prototype指向原型。(所有函数都有prototype属性,但实例没有prototype属性)
  3. 原型对象有constructor,指向该原型的构造函数。

举个例子:

var Foo = function(name){
this.name=name;
}
var foo = new Foo(‘莉莉’);

自制截图,哼
4. 实例的__proto__指向原型。(proto前后各有两个横线,捂脸)
自制截图,哼
所有引用类型(对象、数组、函数)都有__proto__这个属性。例如,Foo这个函数的原型是Function构造函数的实例。
自制截图,哼

原型链

基本原理

任何一个实例都可以通过原型链找到它上面的原型,该原型对象的方法和属性可以被它的所有原型实例共享。
Object是原型链的顶端。
原型可以起到很好的继承作用。原型对象中的方法和属性可以被不同实例共享。

//给Foo的原型添加say函数
Foo.prototype.say = function(){
console.log(“你好!”)
}

原型链的关键

在访问一个实例时,如果实例本身没找到该方法或属性,就往原型上找。如果还找不到,就往上一级的原型找。

instanceof的原理

转载自网络,侵权联系删除。
作用:用于判断实例属于哪个构造函数。
原理:判断实例的__proto__属性和构造函数的prototype属性是否指向同一个地址,是否为同一个引用。

注意:

  1. 实例是由构造函数new出来的,但是实例的__proto__指向的是构造函数的prototype。也就是说,实例的__proto__属性与构造函数本身无关。
  2. 在原型链上,原型的上面还会有原型。以此类推往上继续找__proto__属性,如果这条链上能找到,那么instanceof返回的结果也是true。

举个例子:

  1. foo instance of Foo的结果为true,因为foo.proto === Foo.prototype为true。
  2. foo instance of Object的结果为true,因为Foo.prototype.proto === Object.prototype为true。
    但是我们不能说,foo是由Object创建的实例,这句话是错的。我们可以借助一个问题来思考这句话的错误。

问题:已知A继承B,B继承C,那么a是A直接生成的实例,还是由B或C生成的呢?
这需要用到原型的constructor属性,foo.proto.constructor === Foo =true,但是foo.proto.constructor === Object =false。
所以用constructor判断比instanceof要严谨。

new运算符

当new Foo()时发生了什么:

  1. 创建一个新的空对象实例。
  2. 将此对象的隐式原型指向其构造函数的显式原型。
  3. 执行构造函数(传入相应参数,没有不用传),同时this指向这个新实例。
  4. 如果返回值是一个新对象,直接返回即可;没有返回值或返回非对象值,那么返回第一步创建的对象。

类继承和原型继承的区别

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象及原型链 的相关文章

  • jQuery 会在过滤选择器中的其他参数之前搜索 ID 吗?

    这个问题与性能有关 如果我使用如下选择器 myID a Does this find myID and filter by a 或者我应该这样写声明 myID find a 我不确定 jQuery 是否足够聪明 可以首先使用 ID 执行此语
  • Jquery - 如何替换div中的一个单词?

    我有一个从其他位置复制的 div 我需要更改其中的一个单词 这是 HTML div class dealer addy 8726 N Royal Ln br Irving TX 75063 br email protected cdn cg
  • 使用 Passport 进行 Node.js 身份验证:如果字段丢失,如何闪烁消息?

    我正在使用 Passport js 如果我的表单字段为空 我想显示一条消息 但我不知道该怎么做 因为如果缺少护照 则不会触发策略回调 我真的希望这个用例更加清晰 而且我不想修改护照 我感觉有办法 但不知道在哪里 我尝试使用路线的回调 app
  • 如何对页面的某个部分进行实时更新?

    我需要刷新页面的各个部分 以便在有新数据时进行更新 我该怎么办 使用jquery 例子 是的 jQuery 非常适合这个 查看这些方法 http api jquery com category ajax http api jquery co
  • JavaScript:所有标准内置对象实际上都是构造函数吗?

    我最近一直在研究 JavaScript 在花了几个月的时间之后 我仍然对一些内部结构感到困惑 具体来说 我试图理解所谓的标准内置对象 https developer mozilla org en US docs Web JavaScript
  • 如何告诉 Sonar 使用我的可靠报告来获取单元测试结果

    我们有一个 Jenkins 作业 其中包含一堆 javascript 文件 我们通过 grunt 构建项目 并在构建结束时运行 JSCover 来运行单元测试并收集代码覆盖率 这一切都有效 我们得到了一个不错的 LCOV 文件 并且在 ta
  • 在 NodeJs 中使用 Jest 模拟 Http Post 请求

    我有一个使用本机 https request 使用 Azure Function 内的 Node Js 构建的外部 POST API 一切正常 现在我正在尝试构建单元测试用例 并对模拟 Request 方法感到震惊 回调响应具有 on 功能
  • JavaScript 回调的效率

    我只是想证实我的一个怀疑 我偶然发现了一篇文章 建议按以下方式使用 Socket io var app require express createServer var io require socket io listen app app
  • 使用 javascript 和 jQuery UI datepicker 获取工作日数

    我有两个日期选择器 我可以从中计算天数 而无需计算星期六和星期日 但我想在周五和周六这样做 我尝试过一些不同的方法但失败了 对我来说 处理不包括周六和周日的天数很容易 但处理周五和周六的天数则不然 以下是我的 javascript 代码 f
  • 如何拆分字符串,在特定字符处断开?

    我有这个字符串 john smith 123 Street Apt 4 New York NY 12345 使用 JavaScript 将其解析为最快的方法是什么 var name john smith var street 123 Str
  • Django 管理中的自定义依赖下拉菜单

    我有一个按阶段模型的项目外键 我很难在 Django 管理页面中创建依赖的下拉列表 我想当用户从该项目的 项目下拉 阶段选择一个项目时 在第二个下拉菜单中显示 实现这一目标的最佳方法是什么 如果下拉列表根据其父级的值来过滤项目 那就太好了
  • 链接index.html client.js 和 server.js

    我从 Node js 开始 我的第一个程序已经遇到了问题 下面是我正在使用的代码 索引 html
  • td 内的文本可以随 td 一起调整大小吗? (是其高度的百分比?)

    我有一个 100 占屏幕的表格 里面有 3x3 9 个单元格 每个单元格占 33 到目前为止 一切都很好 这是一个干净 可扩展的井字棋游戏 问题在于 TD 内的文本不会随比例缩放 有没有办法说 我希望文本大小为 TD 高度的 30 或者其他
  • 将变量从一个 jsp 发送到另一个 jsp

    我有一个 JSP 文件jsp 1 jsp和另一个 JSP 文件jsp 2 jsp 我已经包括了jsp 2 jsp in jsp 1 jsp using 现在我需要某个元素上的单击事件 在该事件中 我想将字符串变量传输到包含的 jsp 中 假
  • Firefox 本地主机上的 Twilio 屏幕共享?

    目前 Firefox 中本地主机上的屏幕共享会引发以下错误 The request is not allowed by the user agent or the platform in the current context 这是我的代码
  • 将 html

    我有一些服务器端代码当前支持 http 字节范围请求 没有任何问题 但是 我希望能够在将转码后的块发送到客户端之前使用 ffmpeg 即时转码视频文件 位于磁盘上 但 ffmpeg 要求我在获取字节时给它一个寻道时间范围来自客户 给定客户端
  • 如何捕获 google 地图的无效 API 密钥

    我有这个代码 如果密钥无效 则会弹出警报 但我想在这种情况下执行一些操作 但我不知道如何连接它 有任何想法吗 Google 不提供检查 Google 地图 API 密钥的外部方法 因此 您无法使用例如查询某些服务 此代码有效吗abcde12
  • 离子选择:预选值在单击一次之前是不可见的

    我刚刚在 ionic 版本 6 中创建了一个 ion select 我的问题是 我在页面加载时已成功预选了一个值 但此预选值未显示在 UI 中 它只是在我单击选择之后出现 但在它没有出现之前 如图 2 所示 我在 ionViewWillEn
  • JQuery 循环遍历动态元素并获取数据值

    我正在尝试使用可折叠面板来完成我的要求 sport on click function var thisId this attr id var thisChildren this sportlist thisChildren each fu
  • 将画布下载为 PNG 图像[重复]

    这个问题在这里已经有答案了 当我尝试将画布下载为 PNG 图像时 浏览器会在新页面中打开该图像 但不下载它 我的下载代码 btnScaricaEtichetta click function console log Download loc

随机推荐

  • 创建随机点使用支持向量机进行分类(Arcgis+Envi)

    独自摸索是比较痛苦的 每周末两天才能碰巧挖出一个点 希望这篇文章能对你有所帮助 话不多说直接进入正题 首先在arcgis中导入图片 可能遇到此类情况 解决办法如下 双击图片 symbology RGB三通道选择波带 stretch选择拉伸方
  • Java自带排序函数sort()的使用方法

    import java util Arrays class Solution public int sortedSquares int nums int nums1 new int nums length for int i 0 i lt
  • git命令创建,合并,删除分支代码

    创建分支 1 git branch test 创建一个test的分支 2 git checkout test 切换到test分支 3 git add 4 git commit m 提交代码的说明 5 git remote add origi
  • 645.错误的集合(力扣leetcode) 博主可答疑该问题

    一 笔记部分 思路 1 可以用排序 先排序后连续两个相同 还有那个位置上缺了就是那个 2 转化为负数 先遍历一次先将每个元素所对应位置的树转化为负数 然后再遍历一次看那个是负数 就是出现了两次 再看索引的数字是否为负数 因为出现了的都是为负
  • go_命令行参数Args、flag

    Args os Args是一个string的切片 可以存储所有的命令行参数 在终端运行才行 func main args os Args for i v range args fmt Println 索引 i t数据 v 既然是切片 那就可
  • 2022年iOS上架及证书最新申请流程

    最近的15年 手机行业无论怎么变 ios系统依然还是占据着行业的榜首位置 而打包一个苹果的app 门槛则比较高 主要的原因在于苹果app的开发 打包时需要p12格式的证书文件和描述文件profile文件 在hbuilder和apicloud
  • 关于串口助手接收到数据,但显示的数据(16进制)为00的解决方法

    只需要把波特率调低就行
  • 直流电机控制 pwm 和 pid 算法

    下面的文章是我转载的 所以作者若是看到不允许转载 请给我留言或给我邮件 lushiliangcsdn 163 com 我会立即删除 转载原因 这篇文章把pid 算法解释的很详细 我担心以后这篇文章无故删除 才转载到我这边的 谢谢 转载来源于
  • 错误代码57049处理

    DB2 SQLSTATE 57049 处理过程 错误代码57049 修改 etc services 修改实例参数db2inst1参数 错误代码57049 db2 connect to 数据库 后报 SQLSTATE 57049 错误 SQL
  • Ubuntu18.04 搭建ros环境

    目录 一 查询版本 二 配置Ubuntu软件库 三 安装 1 设置安装源和密钥 2 更新可用软件包列表 问题 问题 3 安装 4 初始化 问题 5 更新 6 添加环境变量 7 安装rosinstall 8 安装catkin编译器 9 实例测
  • U3D客户端框架之小堆顶高性能定时器测试10W计时器耗时1.9ms

    1 小顶堆计时器概要 小根堆定时器的优点如下 a 添加时间复杂度为O 1 b 删除时间复杂度为O 1 c 执行一个定时器的时间复杂度为O 1 2 代码设计 之前写的服务器定时器是全部轮询更新 这种计时器性能太差 每一帧都要全部迭代一次 客户
  • 全网最全的最通俗易懂的-jmeter调试错误全集

    一 前言 在使用jmeter做接口测试的过程中大家是不是经常会遇到很多问题 但是无从下手 不知道从哪里开始找起 对于初学者而言这是一个非常头痛的事情 这里结合笔者的经验 总结出以下方法 二 通过查看运行日志调试问题 写好脚本后 可以先试着运
  • 强化学习入门笔记

    学习情况 先后听了两门课程 分别是David Silver的RL和Sergey Levin的DRL 各耗时一周左右 后者更难一些 对RL基本概念 常用算法原理及其伪代码有了大致了解 但是因为时间有点赶 没有敲完整的算法代码 由于已经有写得比
  • vue每个生命周期的作用,以及在哪个阶段发请求,详解

    1 什么是vue生命周期 有什么作用 每个 Vue 实例在被创建时都要经过一系列的初始化过程 例如 需要设置数据监听 编译模板 将实例挂载到 DOM 并在数据变化时更新 DOM 等 同时在这个过程中也会运行一些叫做 生命周期钩子 的函数 这
  • C++文件 I/O操作

    文件流类和文件流对象 输入输出是以系统指定的标准设备 标准设备 输入设备为键盘 输出设备为显示器 为对象 在实际的开发中 不可避免会以磁盘文件作为对象 即从磁盘文件读取数据 将数据输出到磁盘文件 与文件输入输出有关的类主要定义在fstrea
  • verilog 不可综合语句

    础知识 verilog 不可综合语句 1 所有综合工具都支持的结构 always assign begin end case wire tri aupply0 supply1 reg integer default for function
  • 前端批量删除之bootstrapTable多选

    获取表单 选中表单的值 var rows exampleTable bootstrapTable getSelections 返回所有选择的行 当没有选择的记录时 返回一个空数组 if rows length 0 layer msg 请选择
  • Node16版本 对应node-sass和sass-loader的版本号

    node sass 6 0 1 sass loader 10 2 0 1 打开package json文件 把图中node sass和sass loader的版本号进行修改 版本号改成上面代码所示的版本 2 改完记得要打开终端重新npm i
  • 决策树(decision tree)(一)——构造决策树方法

    决策树 decision tree 一 构造决策树方法 说明 这篇博客是看周志华老师的 机器学习 西瓜书 的笔记总结 虽然自己写了很多总结性文字包括一些算法细节 但博客中仍有部分文字摘自周老师的 机器学习 书 仅供学习交流使用 转载博客务必
  • 对象及原型链

    对象及原型链 面向对象的三大特性 原型链 创建对象的方法 原型 构造函数 实例 原型链 原型 构造函数 实例三者之间的关系 原型链 基本原理 原型链的关键 instanceof的原理 new运算符 类继承和原型继承的区别 本文仅为前端初学者