前端面试题 | new 操作符的原理 |(对象的原型 及其用途)

问题:new操作符具体干了什么?

总结:

在JavaScript中,new操作符 用于创建一个新的对象实例

作用是 ①创建一个空对象 ②将这个新对象的隐式原型指向构造函数的显式原型 ③它将构造函数的this指向这个新对象,并执行构造函数中的代码,初始化这个新对象 ④返回对象。

在使用new操作符时,需要注意构造函数必须使用new操作符来调用,否则this将指向全局对象。同时,构造函数中

不需要显式地返回一个对象----》new操作符会自动返回新创建的对象,即obj;

显式返回一个对象-----》 返回 return后面的内容/引用类型,即 res,也就是 Fun.apply(obj)


目录

new 操作符的原理/执行过程

(1)创建了一个新的空对象 ---> let obj = {};

(2)将空对象和构造函数通过原型连接起来

(3)将构造函数中的 this 绑定给新对象

(4)返回对象

实现 new 操作符(几种写法)

其他知识点

对象的原型

(1)隐式原型

(2)显式原型

原型的用途

 this指向


new 操作符的原理/执行过程

(1)创建了一个新的空对象 ---> let obj = {};
(2)将空对象和构造函数通过原型连接起来

<---> 构造函数的显示原型 赋值给 对象的隐式原

<---> obj._proto_ = Fun.prototype,即 将对象的 _proto_属性 指向 构造函数的 prototype对象

设置新对象的 constructor 属性为构造函数的名称,设置新对象的 proto 属性指向构造函数的 prototype 对象; obj._proto_ = Fun.prototype; ----> 扩展了 新对象的原型链 

(3)将构造函数中的 this 绑定给新对象

将构造函数的 this 指向创建的对象

方法:构造函数.call(新对象)  或 构造函数.apply(新对象,参数)

                即  let  res = Fun.call(obj)  或 Fun.apply(obj, args)

new 操作符会调用指定的构造函数,并将 新创建的对象作为 构造函数的 this 上下文

----> 构造函数内部可以使用 this 来访问和修改 新对象的属性。

(4)返回对象

几种说法:

  • 若构造函数没有返回空对象,那么自动返回创建出来的新对象。
  • 判断函数的返回值类型,若为值类型,则返回创建的对象;若为引用类型,则返回这个引用类型的对象。
  • 构造函数一般没有显示返回,new操作符自动返回新创建的对象作为结果;若构造函数显示返回,返回对象会覆盖默认返回的新对象。
  • 返回 this 指针。当存在显示的返回时,返回 return 后面的内容。新建的空对象作废。

即 return res instanceof Object ? res : obj

----》☆ 存在显式返回,为引用类型,返回 res;不存在显式返回,为值类型,返回 obj

实现 new 操作符(几种写法)

const _new = function(Fun,...args) {// 1. 创建空对象  let obj = Object.create(null)// 2. 将对象与构造函数通过原型连接// 将 构造函数的显式原型 赋值给 对象的隐式原型// 等价于 obj._proto_ = Fun.prototypeObject.setPrototypeOf(obj, Fun.prototype)// 3. 将构造函数的this指向对象,并向函数传参let res = Fun.apply(obj, args)// 4. 确保返回的是一个对象return res instanceof Object ? res : obj
}
const _new = function(Fun,...args) {let obj = {}obj._proto_ = Fun.prototypelet res = Fun.apply(obj, args)return res instanceof Object ? res : obj
}
const _new = function(Fun,...args) {let obj = Object.create(Fun.prototype)let res = Fun.apply(obj, args)return res instanceof Object ? res : obj
}

其他知识点

对象的原型
(1)隐式原型

        - 每个对象都有一个[[ Prototype ]],称为对象的原型(隐式原型)。

        - 对象的原型不是直接显示的,采用以下的方法查看

                ① obj._proto_

                ② Object.getPrototypeOf(obj)    注:es5以后

(2)显式原型

可以直接通过 prototype 属性获取

☆原型总结:隐式原型---> _proto_

                     显式原型---> prototype

原型的用途

找对象的属性时,会触发 getter 操作

① 先看自己对象中有无该对象,若有,直接用

② 没有,则沿着原型中查找,直到找到 Object 的原型,Object 的原型为 null

 this指向

通过 call 或 apply 方法进行指定

参考的文献:
前端经典面试题 | New操作符的原理_new操作符的实现原理-CSDN博客

new操作符的实现原理及几种手写方法-CSDN博客

new的操作符具体做了什么?_js new操作符做了什么-CSDN博客

2023Web前端开发八股文&面试题(万字系列)——这篇就够了!_前端八股文-CSDN博客(js 1.13)

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

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

相关文章

pyinstaller 不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法(详细)

首先我们需要查看是否安装了pyinstaller &#xff0c;可以在命令窗口输入命令pip list检查是否安装成功&#xff0c; 这里我们可以看见已经安装成功了的&#xff0c;如果没有安装可以执行安装命令 pip install pyinstaller 进行安装即可。 下一步我们排查pyinstaller的安装路…

LeetCode 139 —— 单词拆分

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 定义 d p [ i ] dp[i] dp[i] 表示 s [ 0 , i ] s[0, i] s[0,i] 是否可以被字典中出现的单词拼接&#xff0c;那么状态转移方程为&#xff1a; d p [ i ] t r u e &#xff0c;如果存在任意 j ∈ [ 0 , i − 1…

spring源码分析之AOP开启注解

AOP开启注解 在使用注解Aspect来进行AOP操作时&#xff0c;需要在xml中进行配置 <!-- 使Aspect注解生效 --><aop:aspectj-autoproxy/> 创建BeanFactory时obtainFreshBeanFactory()在解析xml加载BeanDefinition中&#xff0c;执行parseBeanDefinitions方法进行解析发…

Springboot+vue项目零食销售商城

摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;零食销售商城当然也不能排除在外。零食销售商城是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff…

Verilog 触发器状态机语言描述

触发器状态机语言描述 触发器状态机语言用于描述映射到 ILA 调试核的高级触发器逻辑的复杂触发条件。触发器状态机具有下列特性 &#xff1a; • 最多 16 种状态。 • 用于复杂状态转换的单向、双向和三向条件分支。 • 4 个内置 16 位计数器 &#xff0c; 用于对事件…

Golang编译优化——稀疏条件常量传播

文章目录 一、概述二、稀疏条件常量传播2.1 初始化worklist2.2 构建def-use链2.3 更新值的lattice2.4 传播constant值2.5 替换no-constant值 一、概述 常量传播&#xff08;constant propagation&#xff09;是一种转换&#xff0c;对于给定的关于某个变量 x x x和一个常量 c …

浙江大学 → PAT 1012:数字分类

【题目来源】https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId994805311146147840&page0【题目描述】 给定一系列正整数&#xff0c;请按要求对数字进行分类&#xff0c;并输出以下 5 个数字&#xff1a; A1​ 能被 5 整除…

《米小圈上学记》|快乐读书,从身边的人身边的事开始!

时间&#xff0c;抓住了就是黄金&#xff0c;虚度了就是流水;书&#xff0c;看了就是学问&#xff0c;没看就是废纸:抱负&#xff0c;努力了才叫幻想&#xff0c;放弃了那只是妄想。读书&#xff0c;不一定能转变命运&#xff0c;但肯定能让我们安静&#xff0c;安静本身就是一…

js/ts全栈开发 t3 stack

技术栈 React Vite TailwindCSS / Nestjs TRPC Prisma(SQLite) / Docker GitHub: https://github.com/cooderl/react-nestjs-full-web-app t3 stack The T3 Stack is a web development stack made by Theo focused on simplicity, modularity, and full-stack type safet…

红米1s 刷入魔趣 (Mokee)ROM(Android 7.1)

目录 背景准备工具硬件&#xff08;自己准备&#xff09;软件&#xff08;我会在文末提供链接&#xff09; 刷机步骤1. 重启电脑2. 安装驱动3. 刷入TWRP4. 清空数据5. 刷入魔趣6. 开机 结尾下载链接 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 B…

Ubuntu 22.04 下 Pycharm 卸载

由于调试原因&#xff0c;Ubuntu22 下重装Pycharm 1.卸载 PyCharm 删除以下几个目录&#xff1a; 1) 程序文件目录 所有的相关文件都保存在解压缩的目录中&#xff0c; /opt/pycharm-community/ $ sudo rm -r /opt/pycharm-community/ 2) 配置文件目录 启动 PyCharm 后&…

虚拟机jvm下

jvm原理与实践 java程序的跨平台特性 jvm基本结构 JVM类加载流程和内存结构总览 类加载 加载阶段 类加载 验证阶段 类加载 准备阶段 类加载 解析阶段 类加载 初始化阶段 程序计数器 虚拟机栈&本地方法栈 栈帧操作 堆 方法区 永久代 元空间 垃圾回收 可触及性

C#面:C# 是否可以对内存直接进行操作

在C#中&#xff0c;可以通过使用指针来对内存进行直接操作。 使用 unsafe 关键字来支持指针操作&#xff0c;并且需要在项目属性中启用选项&#xff1a;允许不安全代码。使用指针可以绕过 C# 的类型安全检查&#xff0c;因此需要谨慎使用&#xff0c;并且只有在必要的情况下才…

暗区突围国际服pc端海外版新手前期如何赚钱 暗区突围新手教学

暗区突围国际服pc端海外版新手前期如何赚钱 暗区突围新手教学 暗区突围是一款极为惊险的射击游戏&#xff0c;让玩家充分感受紧张激烈的战斗以及获取财富的过程。但是有许多新手玩家是不会在游戏里赚钱的&#xff0c;也会在赚钱过程中遇到很多问题&#xff0c;我将在这篇文章…

多线程【阻塞队列】(生产者消费者模型代码实现)

阻塞队列 解耦合削峰填谷生产者消费者模型&#xff1a; 解耦合 削峰填谷 生产者消费者模型&#xff1a; 正常来说&#xff0c;wait通过notify唤醒&#xff0c;其他线程调用了take,在take的最后一步进行notify. package thread; class MyBlockingQueue{private String [] data…

细胞自动机与森林火灾与燃烧模拟

基于 元胞自动机-森林火灾模拟_vonneumann邻域-CSDN博客 进行略微修改&#xff0c;解决固定方向着火问题&#xff0c;用了一个meshv2数组记录下一状态&#xff0c;避免旧状态重叠数据失效。 参数调整 澳洲森林火灾蔓延数学建模&#xff0c;基于元胞自动机模拟多模式下火灾蔓延…

【牛客】【模板】二维前缀和

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二维前缀和板题。 二维前缀和&#xff1a;pre[i][j]a[i][j]pre[i-1][j]pre[i][j-1]-pre[i-1][j-1]; 子矩阵 左上角为(x1,y1) 右下角(x2,y2…

.OpenNJet应用引擎实践——从 0-1 体验感受

目录 一. &#x1f981; 写在前面二. &#x1f981; 安装使用2.1 安装环境2.2 配置yum源2.3 安装软件包2.4 编译代码2.5 启动 三. &#x1f981; 使用效果3.1 编辑配置文件3.2 编辑 HTML 代码 四. &#x1f981; 使用感受 一. &#x1f981; 写在前面 现在互联网体系越来越往云…

java如何获取一维数组长度

获取一维数组长度的语法格式是 数组名.length 如果数组知道了长度就不用了&#xff0c;但是不知道就需要用了。 示例代码如下 public class Getarraylength{ public static void main(String[] args){ String class1[]{"张三","李四","王…

记录PR学习查漏补缺(持续补充中。。。)

记录PR学习查漏补缺 常用快捷键文件编辑素材序列标记字幕窗口帮助 效果基本3D高斯模糊查找边缘色彩颜色平衡超级键马赛克中间值变形稳定器轨道遮罩键 常用 快捷键 注意&#xff1a;比较常用的用红色字体显示 文件 快捷键作用Ctrl Alt N新建项目Ctrl O打开项目Ctrl I导入…