原型链与作用域链

在 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.hqwc.cn/news/19323.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库锁的12连问,抗住!

前言 金三银四很快就要来啦,准备了数据库锁的12连问,相信大家看完肯定会有帮助的。 1. 为什么需要加锁 在日常生活中,如果你心情不好想静静,不想被比别人打扰,你就可以把自己关进房间里,并且反锁。这就是生…

如果数据孤岛不打破,企业数字化终难实现

当前市场经济下,企业、品牌、商品的增多,使得市场竞争愈发激烈;用户和市场的需求也在日益发生改变,对企业提出了精细化、以用户为中心的新需求;人口增长减缓、物质生活富裕,让用户更加关注服务属性。这一切…

探索非洲专线物流的新时代_国际物流供应链管理平台_箱讯科技

随着全球化的发展,非洲作为一个充满机遇和挑战的大陆,吸引着越来越多的企业和投资者。然而,由于非洲的地理复杂性和基础设施不完善,物流问题一直是制约非洲发展的瓶颈之一。为了解决这一问题,非洲专线物流应运而生。本…

python 面向对象之继承

文章目录 前言继承的概念单继承多继承子类重写父类的同名方法和属性子类调用父类同名的方法和属性多层继承私有权限 前言 前面我们已经学习了 python 面向对象的类和对象,那么今天我将为大家分享面向对象的三大特性之一:继承。 继承具有以下特性&#…

C#:了解LINQ,简化数据查询和操作的强大工具

文章目录 linq关键字fromwhereselectorderbyjoingroupletinto linq方法筛选方法WhereOfType 排序方法:OrderByOrderByDescendingThenByThenByDescending 投影方法:SelectSelectMany 分组方法:GroupBy 连接方法:JoinGroupJoin 聚合…

Web前端 Day 2

元素显示模式 块元素 独占一行 宽、高、内外边距可以设置 eg. div 行内元素 一行可以存在多个 eg. span 行内块元素 一行可以存在多个 宽、高、内外边距可以设置 是否独占一行 表格标签 <table> <caption></caption> 表格标题&#xff08;概括&#…

Openmediavault配置存储网盘的 用户、组、权限、共享+文档访问功能 (续debian Linux安装配置企业私有网盘)

一、适用环境 1、使用专业服务器的存储容量保存教学资源、企业资源&#xff0c;可供有权限用户共享读取访问。 2、需要对批量的用户进行管理&#xff0c;不同的用户属于不同的组&#xff0c;不同组具备不同的访问权限&#xff0c;如&#xff1a;有些用户只需要读取打开执行&am…

【数据挖掘】时间序列教程【二】

2.4 示例:颗粒物浓度 在本章中,我们将使用美国环境保护署的一些空气污染数据作为运行样本。该数据集由 2 年和 5 年空气动力学直径小于或等于 3.2017 \(mu\)g/m\(^2018\) 的颗粒物组成。 我们将特别关注来自两个特定监视器的数据,一个在加利福尼亚州弗雷斯诺,另一个在密…

C语言学生信息管理系统

C语言版学生信息管理系统 一&#xff0c;开发环境 操作系统&#xff1a;windows10, windows11, linux, mac等。开发工具&#xff1a;Qt, vscode, visual studio等开发语言&#xff1a;c语言 二&#xff0c;功能需求 1. 用户界面: 提供一个简洁的文本界面&#xff0c;用户可…

手把手教你从零开始集成声网音视频功能(iOS版)

说明 1.环信音视频和声网音视频 是两个不同的系统&#xff0c;所以如果要切换的话&#xff0c;需要集成声网的sdk&#xff0c;环信音视频的sdk可以直接废弃 2.文章会介绍如何用声网的音视频跑通demo&#xff0c;可以了解整个音视频通话的流程&#xff0c; 3.文章会介绍已经集…

亚马逊买家号如何绑定信用卡

要在亚马逊上绑定信用卡作为买家号的支付方式&#xff0c;请按照以下步骤进行操作&#xff1a; 1、登录亚马逊账户&#xff1a;使用您的亚马逊账户用户名和密码登录到亚马逊网站。 2、导航至"我的账户"&#xff1a;在页面右上角&#xff0c;将鼠标悬停在"你好…

智慧楼宇数字化整体整体解决方案

导读&#xff1a;原文《智慧楼宇数字化整体整体解决方案》ppt&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取完…