手写call,apply,bind,new

三种情况都是改变this的指向,不同的是bind返回的是一个函数

//call
let foo = {value: 1
};Function.prototype.call2 = function (context) {const context2 = context || window//this指的是要改变this函数context2.fn = thisconst args = [...arguments].slice(1)//调用一次再删除即可const result = context2.fn(...args)delete context2.fnreturn result
}console.log(bar.call2(foo,'james',20));
//apply
Function.prototype.apply2 = function (context,arr=[]) {const context2 = context || windowcontext2.fn = thisconsole.log(arr,888);const result = context2.fn(...arr)delete context2.fnreturn result
}console.log(bar.apply2(foo,['james',20]));
var value = 2;var foo = {value: 1
};function bar(name, age) {this.habit = 'shopping';console.log(this.value);console.log(name);console.log(age);
}bar.prototype.friend = 'kevin';var bindFoo = bar.bind(foo, 'daisy');var obj = new bindFoo('18');
// undefined
// daisy
// 18
console.log(obj.habit);
console.log(obj.friend);
// shopping
// kevin//bind
function bar3() {console.log(this.value);
}
Function.prototype.bind2 = function (context) {if(typeof this !== 'function'){throw new Error("this is not a function")}let _this = this //此处获取的是指向bar的thislet args = [...arguments].slice(1)let fnop = function(){}//判断是否作为构造函数使用let fBound = function(){let bindArgs = [...arguments]//this为实例对象,在实例对象中的this指向无效 指向windowreturn _this.apply(this instanceof fnop?this:context,[...args, ...bindArgs])}fnop.prototype = this.prototype//获取原型对象,继承原型对象的属性fBound.prototype = new fnop() //防止一同修改this的原型对象,使用fnop作为中间站return fBound
}const bindFn = bar3.bind2(foo)
bindFn()

 如果bind返回的参数 作为构造函数使用,那么这个this的指向就无效了。

//newfunction Person(){}
let person = objectFactory(Person,data)
function objectFactory(){let obj = new Object()const Constructor = [].shift.call(arguments) //会返回第一个参数,也就是构造函数const ret = Constructor.apply(obj,arguments) //绑定了thisobj.__proto__ = Constructor.prototypereturn typeof ret === "object"?ret:obj; //判断返回值
}

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

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

相关文章

Springboot+Vue项目-基于Java+MySQL的免税商品优选购物商城系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

【LeetCode热题100】【贪心算法】跳跃游戏

题目链接:55. 跳跃游戏 - 力扣(LeetCode) 数组的元素表示可以跳的最大长度,要判断能不能跳到最后 不断更新可以跳到的最远距离,如果当前的位置大于可跳最远距离,说明不行 class Solution { public:bool …

【Qt】常用控件(LCD Number/进度条/日历)

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、LCD Number(LCD显示器) 一个倒计时程序 二、ProgressBar(进度条) 1、创建一个进度条&#xff0c;100ms进度增加…

Android Binder——C++层注册服务实例(十二)

前面几篇内容都介绍了 C++ 中新增服务的调用流程,这里我们看一个 Android 源码中的实例进一步熟悉 C++ 服务的添加流程,这里以 MediaPlayerService 为例。 一、添加服务调用 1、main_mediaserver.cpp 源码位置:/frameworks/av/media/mediaserver/main_mediaserver.cpp i…

每天学习一个Linux命令之git

每天学习一个Linux命令之git Git是一个分布式版本控制系统&#xff0c;被广泛用于开发软件项目。它提供了许多强大的命令和选项&#xff0c;使开发人员可以更好地管理和跟踪代码的变化。在本篇博客中&#xff0c;我们将详细介绍一些常用的git命令及其选项。 git init git in…

✌粤嵌—2024/3/14—判断子序列

代码实现&#xff1a; 方法一&#xff1a;一次遍历 bool isSubsequence(char *s, char *t) {if (strlen(s) 0) {return true;}int i 0;for (int j 0; j < strlen(t); j) {if (s[i] t[j]) {i;}if (i strlen(s)) {return true;}}return false; } 方法二&#xff1a;动态规…

5.2 mybatis之autoMappingBehavior作用

文章目录 1. NONE关闭自动映射2. PARTIAL非嵌套结果映射3. FULL全自动映射 众所周知mybatis中标签< resultMap >是用来处理数据库库字段与java对象属性映射的。通常java对象属性&#xff08;驼峰格式&#xff09;与数据库表字段&#xff08;下划线形式&#xff09;是一 一…

基于SSM项目个人健康信息管理系统

采用技术 基于SSM项目个人健康信息管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 用户端 用户首页 健康知识 用户注册 医院推荐信息 系统概要…

【LeetCode热题100】【矩阵】螺旋矩阵

题目链接&#xff1a;54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 先走外面的圈再走里面的圈&#xff0c;可以用递归来解决&#xff0c;对于要走的一个圈&#xff0c;由四个角决定&#xff0c;其实是三个数&#xff0c;&#xff08;0&#xff0c;0&#xff09;&…

VUE相关知识锦集

一、生命周期的使用场景 created ----- 单组件请求 mounted----- 同步可以获取dom,如果先子组件请求后父组件请求 activated-----判断id是否相等&#xff0c;如果不相同发起请求 destory-----关闭页面记录视频播放时间&#xff0c;初始化的时候从上一次的历史开始播放 补充…

Vue.js前端开发零基础教学(五)

目录 4.1 动态组件 4.1.1 定义动态组件 4.1.2 利用KeepAlive组件实现组件缓存 4.1.3 组件缓存相关的生命周期函数 4.1.4 KeepAlive组件的常用属性 4.2 插槽 4.2.1 什么是插槽 ​编辑 4.2.2 具名插槽 4.2.3 作用域插槽 4.3 自定义指令 4.3.1 什么是自定义指令…

使用美化方法设计嵌入的子窗体(三)

使用美化方法设计嵌入的子窗体 分析效果图的实现 效果图&#xff1a; 新建 Windows 窗体 新窗体命名&#xff1a;FrmAddProduct.cs修改窗体的 Text 属性&#xff1a;新增商品修改窗体的位置&#xff1a;StartPosition&#xff1a;CenterScreen窗体的无边框设计&#xff1a…

MySQL 8.0.19安装教程(windows 64位)

在c盘目录下的Program Files目录下创建MySQL目录&#xff0c;将下载好的mysql解压到里面 解压完是这个样子 配置初始化的my.ini文件的文件 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirC:\Program Files\MySQL # 设置mysql数据库的数据的存放目录 datad…

Pytorch DistributedDataParallel(DDP)教程一:快速入门理论篇

Pytorch DistributedDataParallel&#xff08;DDP&#xff09;教程一&#xff1a;快速入门理论篇 目录 一、 写在前面二、什么是分布式并行训练1. 并行训练2. 数据并行 三、DDP的基本原理1. DDP的训练过程2. Ring-All-Reduce算法 四、如何搭建一个Pytorch DDP代码框架1. 与DDP有…

Shortened LLaMA:针对大语言模型的简单深度剪枝法

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题 & 发表会议&#xff1a;Shortened LLaMA: A Simple Depth Pruning for Large Language Models&#xff08;ICLR 2024 Workshop&#xff09; 论文地址&#xff1a;https://arxiv.org/abs/…

Qt标准对话框中文qm文件加载

当使用qt标准对话框时&#xff0c;如QMessageBox&#xff0c;QFileDialog等时&#xff0c;默认都是英文。这时可以从qt安装路径下找到一个translations的文件夹&#xff0c;里面就是qt所有的翻译文件qm文件。 标准对话框主要使用qt_zh_CN.qm , 但是通过查看qt_zh_CN.ts文件里面…

docker拉取镜像速度慢

解决办法是配置阿里云镜像加速 在docker desktop的docker engine里添加 "registry-mirrors": ["https://owzy8hoh.mirror.aliyuncs.com"] 修改以后重启docker 参考&#xff1a; 【docker】Windows10系统下安装并配置阿里云镜像加速_docker desktop 配置…

今天刷两题(day1)

题目一&#xff1a;牛牛取快递 题目描述&#xff1a; 牛牛正在寄快递&#xff0c;他了解到快递在 1kg 以内的按起步价 20 元计算&#xff0c;超出部分按每 kg 1元计算&#xff0c;不足 1kg 部分按 1kg计算。如果加急的话要额外付五元&#xff0c;请问牛牛总共要支付多少快递费…

基于unity+c#的随机点名系统(简单UI界面+列表+数组)

目录 一、功能界面显示 二、UI 1、视频的使用 &#xff08;1&#xff09;渲染纹理 &#xff08;2&#xff09; 视频铺全屏 &#xff08;3&#xff09;视频的调用 2、 下拉文本框的使用&#xff08;旧版&#xff09; 3、输入文本框的使用&#xff08;旧版&#xff09; …

ARM_day6:串口通信

1.实现字符串数据收发函数的封装 头文件&#xff1a; #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_uart.h"void uart4_config(); void putchar(char dat); char …