new 以及 call、apply、bind 关键字解析
1.new关键字
-
自动创建对象:使用
new
调用构造函数时,会自动创建一个空对象,并将其赋值给this
。你不需要显式地使用{}
来创建对象。 -
绑定
this
到新对象:构造函数内部的this
指向新创建的对象,因此可以在构造函数中为新对象添加属性和方法。 -
继承原型链:新对象会继承构造函数的
prototype
属性所指向的对象。这意味着所有通过new
创建的实例都可以访问原型上的属性和方法。 -
隐式返回新对象:构造函数默认返回新创建的对象。如果构造函数中有显式的返回值,只有当返回的是一个对象时才会覆盖默认行为;如果返回的是原始类型(如字符串、数字等),则仍然返回新创建的对象。
-
构造函数必须使用
new
调用:如果忘记使用new
调用构造函数,this
将指向全局对象(浏览器环境中是window
,严格模式下是undefined
),这可能会导致意外的行为和错误。
function Preson() {this.name = 'gauseen'return { age: 18 }
}let p = new Preson()
console.log(p) // 函数中主动返回了一个对象,所以打印是 {age: 18}
console.log(p.name) // 返回的是{age: 18} ,所以没有name属性 undefinedfunction Preson1() {this.name = 'gauseen'return 'tom'
}let p = new Preson1()
console.log(p) // 主动返回的不是对象,所以还是执行默认行为 Preson1 {name: 'gauseen'}
console.log(p.name) // gauseen
2.call
、apply
和 bind
的相同点
- 改变函数的 this 指向:三者都可以用来改变函数内部的
this
指向,使得函数可以在不同的上下文中执行。 - 继承原函数的作用域:调用时会继承原函数的作用域链。
3.不同点
let a = {name: '梦见月',age: 18,getName: function (msg) {return msg + this.name},
}let b = {name: '芙宁娜',
}console.log(a.getName('hi!')) // hi!梦见月console.log(a.getName.call(b, 'hi!')) // hi!芙宁娜console.log(a.getName.apply(b, ['hi!'])) // hi!芙宁娜let getNowName = a.getName.bind(b, 'hi!') // 通过bind改变this指向执行时用方法执行
console.log(getNowName()) // hi!芙宁娜
其实没那么难理解,就是借用的概念,一个对象上没有想用的方法,那就借用别人的方法
4.使用场景
1.类数组借用
let a = {0: '弗洛伊德',1: '阿基维利',length: 2,
}Array.prototype.push.call(a, '叔本华', '东野圭吾')
console.log(a) // [ '弗洛伊德', '阿基维利', '叔本华', '东野圭吾' ]
2.求数组最大值
let a = [1, 2, 3, 4, 56, 7, 99, 6, 1]console.log(Math.max(...a)) // 99
console.log(Math.max.apply(Math, a)) // 99
5.手写 apply、cal l和 bind
let a = [1, 2, 3, 4, 56, 7, 99, 6, 1]// 自定义 call 方法
Function.prototype.myCall = function(context, ...args) {context = context || windowconst fn = Symbol('fn')context[fn] = thisconst result = context[fn](...args)delete context[fn]return result
}// 自定义 apply 方法
Function.prototype.myApply = function(context, args) {context = context || windowconst fn = Symbol('fn')context[fn] = thisconst result = context[fn](...args)delete context[fn]return result
}// 自定义 bind 方法
Function.prototype.myBind = function(context, ...args) {const self = thisreturn function(...newArgs) {return self.myCall(context, ...args, ...newArgs)}
}console.log(Math.max.myCall(Math, ...a))
console.log(Math.max.myApply(Math, a))
console.log(Math.max.myBind(Math)(...a))
相关文章:
new 以及 call、apply、bind 关键字解析
1.new关键字 自动创建对象:使用new调用构造函数时,会自动创建一个空对象,并将其赋值给this。你不需要显式地使用{}来创建对象。 绑定this到新对象:构造函数内部的this指向新创建的对象,因此可以在构造函数中为新对象添…...
【用Deepseek搭建免费的个人知识库--综合教程(完整版)】第二篇:Ollama服务器
用Deepseek搭建免费的个人知识库–综合教程(完整版):第二篇:Ollama服务器部署 OLLAMA服务器的配置在很多网上都已经介绍的非常清楚了,我们的重点不在于那些简单的步骤,而是在需要为下一步做准备的地方更加…...

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现
医院在为患者进行诊断和治疗过程中,会产生大量的医学影像图片,如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存,需要将每个患者文件夹下的图片合并成…...

从基础到人脸识别与目标检测
前言 从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。 颜…...

Elasticsearch:在 Elastic 中玩转 DeepSeek R1 来实现 RAG 应用
在这个春节,如一声春雷,DeepSeek R1 横空出世。现在人人都在谈论 DeepSeek R1。这个大语言模型无疑在中国及世界的人工智能发展史上留下了重要的里程碑。那么我们改如何结合 DeepSeek R1 及 Elasticsearch 来实现 RAG 呢?在之前的文章 “使用…...

寒假2.6--SQL注入之布尔盲注
知识点 原理:通过发送不同的SQL查询来观察应用程序的响应,进而判断查询的真假,并逐步推断出有用的信息 适用情况:一个界面存在注入,但是没有显示位,没有SQL语句执行错误信息,通常用于在无法直接…...

CTF中特别小的EXE是怎么生成的
我们在打CTF时候,出题的爷爷们给出的exe都很小 就10k左右,有的甚至就5k,那时候我很郁闷啊。现在我也能了啊哈哈 不多bb按如下操作: 我们来看看正常的release生成的代码# Copy #include "windows.h" int main(){ Messa…...

git rebase 和 git merge的区别
Rebase 可使提交树变得很干净, 所有的提交都在一条线上。 Merge 则是包含所有的调试记录,合并之后,父级的所有信息都会合并在一起 Rebase 修改了提交树的历史 比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的…...

Gitlab中如何进行仓库迁移
需求:之前有一个自己维护的新仓库A,现在需要将这个仓库提交并覆盖另一个旧的仓库B,需要保留A中所有的commit信息。 1.方法一:将原有仓库A导出后再导入到新的仓库B中 适用场景:新的仓库B是一个待建仓库,相当…...

LabVIEW 开发航天项目软件
在航天项目软件开发中,LabVIEW 凭借其图形化编程优势被广泛应用。然而,航天项目的高可靠性、高精度及复杂环境适应性要求,使得在使用 LabVIEW 开发时,有诸多关键要点需要特别关注。本文将详细分析在开发航天项目软件时需要重点注意…...

深度整理总结MySQL——MySQL加锁工作原理
MySQL加锁工作原理 前言前置知识- 锁为什么加在索引上锁的粒度优化提高并发性避免全表扫描优化死锁处理解决幻读问题 什么SQL语句会加行级锁MySQL是如何加行级锁场景模拟代码唯一索引等值查询退化为记录锁为什么会退化为记录锁分析加了什么锁为什么会退化为间隙锁为什么我可以插…...

kafka专栏解读
kafka专栏文章的编写将根据kafka架构进行编写,即先编辑kafka生产者相关的内容,再编写kafka服务端的内容(这部分是核心,内容较多,包含kafka分区管理、日志存储、延时操作、控制器、可靠性等),最后…...
1-portal认证功能
很多时候公共网络需要提供安全认证功能,比如我们去星巴克或者商场、酒店,我们连接wifi上网的时候, 需要认证后才可以上网。 用户可以主动访问已知的Portal认证网站,输入用户名和密码进行认证,这种开始Portal认证的方式…...
MySQL面试题合集
1.MySQL中的数据排序是怎么实现的? 回答重点 排序过程中,如果排序字段命中索引,则利用 索引排序。 反之,使用文件排序。 文件排序中,如果数据量少则在内存中排序, 具体是使用单路排序或者双路排序。 如果数据大则利用磁盘文件进行外部排序,一 般使用归并排序。 知识…...

spring学习(druid、c3p0的数据源对象管理)(案例学习)
目录 一、博客引言。 二、阿里云-druid案例准备(依赖坐标、配置文件、测试类)。 (1)初始依赖坐标、配置文件与测试类。 (2)导入阿里云-druid依赖坐标。 (3)DruidDataSource。 (4)set…...

WordPress博客在fnOS环境下的极简搭建与公网地址配置指南
文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 你是否曾经为搭建自己的网站而头疼不已?是不是觉得…...
【PG】DROP TABLE ... CASCADE
问题 ERROR: cannot drop table wx_user_tag because other objects depend on it DETAIL: default value for column id of table wx_user_tag depends on sequence wx_user_tag_id_seq HINT: Use DROP … CASCADE to drop the dependent objects too. 解决 这个错误消息表…...

绕组电感 - Ansys Maxwell 磁通链与电流
在本博客中,我将演示如何使用 Ansys Maxwell 中磁瞬态求解器的磁通链和电流结果来计算绕组电感。Ansys Maxwell 磁瞬态求解器在场计算中考虑了涡流效应,我将展示一种使用磁通链和电流结果来计算绕组电感的简单方法。 实际上,电感是非线性的…...

物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统
随着物联网技术的飞速发展,物联网软件开发与应用方向成为了众多开发者关注的焦点。那么,如何在这个领域中脱颖而出呢?本文将为你提供一份详细的学习指南,帮助你从零开始,逐步掌握物联网软件开发与应用的核心技能。 一…...

《LeetCode Hot100》 Day01
Day01 轮转数组 思路: (1) 使用O(1) 空间复杂度解决,就需要原地解决,不能创建新的数组。 (2) 先整体反转数组,再反转前k个数,再反转剩下的数。即可完整本题。 &…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...