原型链与作用域链

news2024/11/18 0:24:36

在 JavaScript 中使用构造函数来新建一个对象的,每一个构造函数内部都有一个 prototype 属性,属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,指向构造函数的 prototype 属性对应的值,在 ES5 中这个指针称为对象的原型,可以通过 __proto__ 属性来访问,但最好不要在实践中使用,因为他不是规范中规定的。ES5 中新增了 Object.getPrototypeOf() 方法,可以通过这个方法来获取对象的原型。

当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里去找这个属性,这个原型对象又会有自己的原型,于是就一直找下去,即原型链。原型链的尽头一般来说都是 Object.prototype 所以这就是新建的对象为什么能使用 toString 方法的原因。

特点:JavaScript 对象是通过引用来传递的,创建的每个新对象实例中并没有一份属于自己的原型副本。当修改原型时,与之相关的对象也会继承这一改变。

原型链的终点是什么?如何打印出原型链的终点?

由于 Object 是构造函数,原型链终点 Object.prototype.__proto__,而 Object.prototype.__proto__ === null,所以,原型链的终点是 null

原型链上的所有原型都是对象,所有的对象最终都是由 Object 构造的,而 Object.prototype 的再上一层是 Object.prototype.__proto__

# 作用域 和 作用域链

  • 全局作用域
    • 最外层函数和最外层函数外面定义的变量拥有全局作用域
    • 所有未定义直接赋值的变量自动声明为全局作用域
    • 所有 window 对象的属性拥有全局作用域
    • 全局作用域由很大的弊端,过多的全局作用域变量会污染全局命名空间,引起命名冲突
  • 函数作用域
    • 声明在函数内部的变量,一般只有固定的代码片段可以访问到

作用域是分层的,内层作用域可以访问外层,反之不行

  • 块作用域
    • ES6 中新增 letconst 指令可以声明块级作用域
    • 块级作用域可以在函数中创建,也可以在一个代码块({})中创建
    • letconst 声明的变量不会有变量提升,也不可以重复声明
    • 在循环中比较适合绑定块级作用域,可以将声明的计数器变量限制在循环内
  • 作用域链
    • 在自己作用域中找不到变量就去父级作用域查找,依次向上级作用域查找,直到访问到全局作用域就终止,这一层层关系就是作用域链
    • 作用域链保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,可以访问到外层环境的变量和函数
    • 本质上是一个指向变量对象的指针列表,变量对象是一个包含了执行环境中所有变量和函数的对象
    • 作用域链的前端始终都是当前执行上下文的变量对象,全局执行上下文的变量对象始终是作用域链的最后一个对象
    • 当查找一个变量时,如果当前执行环境中没有找到,可以沿着作用域链向后查找

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

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

相关文章

electron打包exe桌面项目打开控制台

阿丹: 之前一直在写web项目,按F12开发控制台很方便但是。现在项目涉及到了桌面的应用这就需要在打包的过程中进行书写配置文件main中添加指令来在app加载完成后打开控制台,这样方便我们寻找报错。 打开方式1 因为使用的工具是electron所以找…

Kubernetes中Pod的调度策略

Kubernetes中Pod的调度策略 1、Pod调度 在 Kubernetes 平台上,我们很少会直接创建一个 Pod,在大多数情况下会通过 RC、Deployment、 DaemonSet、Job 等控制器完成对一组 Pod 副本的创建、调度及全生命周期的自动控制任务。 在最早的 Kubernetes 版本…

【动态规划算法练习】day17

文章目录 一、474. 一和零1.题目简介2.解题思路3.代码4.运行结果 二、879. 盈利计划1.题目简介2.解题思路3.代码4.运行结果 三、377. 组合总和 Ⅳ1.题目简介2.解题思路3.代码4.运行结果 四、96. 不同的二叉搜索树1.题目简介2.解题思路3.代码4.运行结果 总结 二维费用的背包问题…

5分钟了解制造核心5大系统的联系

本篇,我们来快速了解一下制造行业核心的5大系统MES、ERP、WMS、PLM和SCADA究竟有怎么样的关系,它们是如何连接的。 上图粗略描述了MES、ERP、WMS、PLM和SCADA五大系统之间的连接关系。 不过,我们先从ERP系统开始,因为这是大部分制…

前端Vue自定义精美底部操作栏导航栏工具栏 可用于电商购物车底部导航

随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单…

Python实现PSO粒子群优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一…

java中CompletableFuture异步编程详解以及实践案例

文章目录 一、CompletableFuture的使用1、 创建CompletableFuture的方式2、 获得异步执行结果3、 对执行结果进行处理4、对执行结果进行消费5、异常处理6、 两组任务按顺序执行7、 两组任务谁快用谁8、 两组任务完成后合并9、 多任务组合 二、一个使用CompletableFuture异步编排…

【算法】区间合并类题目总结

文章目录 重叠区间:452. 用最少数量的箭引爆气球解法1——左边界排序解法2——右边界排序 无重叠区间:435. 无重叠区间解法1——左边界排序解法2——右边界排序 合并区间:56. 合并区间左边界排序这题为什么不能按照右边界排序?其实…

【数据结构与算法】图课后习题

题目 下面一共有七道有关图的课后习题,全部都是思路画图题并不是算法设计题故在此就一起列举出来了~ 1. 已知如下图所示的有向图,请回答下面几个问题 每个顶点的入/出度;邻接矩阵;邻接表;逆邻接表;强连通…

Hugging Face应用——图像识别

利用人工智能解决音频、视觉和语言问题。音频分类、图像分类、物体检测、问答、总结、文本分类、翻译等均有大量模型进行参考。 Eg1: 图像识别 图像分类是为整个图像分配标签或类别的任务。每张图像预计只有一个类别。图像分类模型将图像作为输入并返回有关图像所属类别的预测…

OPPO手机上怎么设置阴历或阳历生日提醒?

有不少手机用户现在使用的都是OPPO这个品牌的手机,并且绝大多数用户都表示OPPO手机是比较好用的,不过也有一部分用户在使用手机的过程中遇到了一些问题,例如不知道在OPPO手机上怎么设置阴历或阳历生日提醒,这应该怎么办呢&#xf…

基于matlab开发和评估停车场场景中的视觉定位算法(附源码)

一、前言 本示例展示了如何使用虚幻引擎模拟环境中的合成图像数据开发视觉定位系统。 获取基本事实以评估定位算法在不同条件下的性能是一项具有挑战性的任务。与使用高精度惯性导航系统或差分GPS等更昂贵的方法相比,不同场景下的虚拟仿真是一种经济高效的方法来获…

数字化时代,到底如何认识商业智能BI?

数字化时代,商业智能BI对于企业的落地应用有着巨大价值,逐渐成为了现代企业信息化、数字化转型中的基础建设。 我曾经看到有人在讨论过商业智能BI的部署对于企业是否有实际意义,现在市场的数据已经证明商业智能BI在商业世界中,在…

使用Docker安装RabbitMQ并实现入门案例“Hello World”

RabbitMQ官方文档:RabbitMQ Tutorials — RabbitMQ 一、RabbitMQ安装(Linux下) 你可以选择原始的方式安装配置,也可以使用docker进行安装,方便快捷! 1. 安装docker 没有docker的先安装一下docker&#x…

谷歌和edge浏览器升级到94及以上版本后反复提示安装pageoffice客户端

原因:Chrome开发团队以网络安全为由,强推ssl证书,希望所有部署在公网的网站,全部改用https访问,所以最新的谷歌和edge升级到94版本后对公网上的http请求下的非同域的http请求进行了拦截,于是就出现了目前遇…

一分钟告诉你国内和国外的ai绘画软件哪个好

前几天,我在一次聚会上偶然听到朋友们谈论起创作ai绘画的问题,大家都很热衷于用国内的ai绘画软件来生成自己喜欢的艺术作品,但又不知道国内和国外的ai绘画软件哪个好。正当我们陷入无尽的思考中时,其中一位朋友突然站出来说&#…

【计算机网络】1.5——计算机网络的体系结构

计算机网络的体系结构 概述 计算机网络的体系结构是计算机网络及其构建所应完成功能的精确定义 考题 不属于网络体系结构所描述的内容的是 A、网络的层次 B、每层使用的协议 C、协议的内部实现细节 D、每层必须完成的功能 这些功能的「实现细节」,是遵守这种体系…

SPEC CPU 2017 Ubuntu 20.04 LTS cpu2017-1_0_5.iso 安装、测试 单核成绩 笔记

环境 $ gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPER/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper OFFLOAD_TARGET_NAMESnvptx-none:amdgcn-amdhsa OFFLOAD_TARGET_DEFAULT1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pk…

vue3中的computed和watch

一、computed 1. vue2和vue3中计算属性用法对比 Vue2中的计算属性 Vue2中的计算属性是通过在Vue实例的computed选项中定义函数来创建的。计算属性会根据依赖的响应式属性进行缓存,只有当依赖的属性发生变化时,计算属性才会重新求值。 举个例子&#x…

【环境配置】Conda报错 requests.exceptions.HTTPError

问题&#xff1a; conda 创建新的虚拟环境时报错 Collecting package metadata (current_repodata.json): done Solving environment: done# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<…