Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >手写apply/call/bind/new等代码

手写apply/call/bind/new等代码

作者头像
epoos
发布于 2022-06-06 08:11:05
发布于 2022-06-06 08:11:05
2711
举报
文章被收录于专栏:epoos.comepoos.com

1.手写 apply

代码语言:javascript
AI代码解释
复制
Function.prototype.apply1 = function(context = window, args) {
  const fn = Symbol('fn')
  context[fn] = this
  const res = context[fn](...args)
  delete context[fn]
  return res
}

// 思路:将要改变this指向的方法挂到目标this上执行并返回
Function.prototype.apply2 = function (context) {
  if (typeof this !== 'function') {
    throw new TypeError('not funciton')
  }
  context = context || window
  context.fn = this
  let result
  if (arguments[1]) {
    result = context.fn(...arguments[1])
  } else {
    result = context.fn()
  }
  delete context.fn
  return result
}

2.手写 call

代码语言:javascript
AI代码解释
复制
Function.prototype.call1 = function(context = window, ...args) {
  const fn = Symbol('fn')
  context[fn] = this
  const res = context[fn](...args)
  delete context[fn]
  return res
}

// 思路:将要改变this指向的方法挂到目标this上执行并返回
Function.prototype.call2 = function (context) {
  if (typeof this !== 'function') {
    throw new TypeError('not funciton')
  }
  context = context || window
  context.fn = this
  let arg = [...arguments].slice(1)
  let result = context.fn(...arg)
  delete context.fn
  return result
} 

3.手写 bind 方法

代码语言:javascript
AI代码解释
复制
Function.prototype.bind1 = function(context, ...args) {
  let self = this
  return function F() {
    if (this instanceof F) {
      return new self(...args, ...arguments)
    }
    return self.apply(context, [...args, ...arguments])
  }
}


// 思路:类似call,但返回的是函数
Function.prototype.bind2 = function (context) {
  if (typeof this !== 'function') {
    throw new TypeError('Error')
  }
  let _this = this
  let arg = [...arguments].slice(1)
  return function F() {
    // 处理函数使用new的情况
    if (this instanceof F) {
      return new _this(...arg, ...arguments)
    } else {
      return _this.apply(context, arg.concat(...arguments))
    }
  }
}

测试代码:

代码语言:javascript
AI代码解释
复制
var obj = {
  a: 1,
  showA(n, m) {
    return this.a + n + m
  },
}
function test1() {
  this.a = 4
  var s = obj.showA.bind(this, 10)
  console.log('result:',s(20)) // 34
}
function test2() {
  this.a = 2
  var s = obj.showA.apply(this, [1, 2])
  console.log('result:', s) // 5
}
function test3() {
  this.a = 3
  var s = obj.showA.call(this, 2, 3)
  console.log('result:', s) // 8
}
test1()
test2()
test3()

4.实现一个 new

new 关键字调用的基本过程 1)创建一个新对象 2)继承父类原型的方法 3)添加父类属性到新对象上,并初始化,并保存方法的执行结果 4)如果执行结果有返回值,并且是一个对象,返回执行的结果,否则返回新创建的对象

代码语言:javascript
AI代码解释
复制
function _new1(obj, ...args) {
  var newObj = Object.create(obj.prototype)
  var result = obj.apply(newObj, args) // obj里面的this变成了newObj,所以,newObj有了obj的属性
  return (typeof result === 'object' && result !== null ) ? result : newObj
}

function _new2 (fun) {
  return function () {
    // 创建一个新对象且将其隐式原型指向构造函数原型
    let obj = {
      __proto__ : fun.prototype
    }
    // 执行构造函数
    fun.call(obj, ...arguments)
    // 返回该对象
    return obj
  }
}

function Person(firstName, lastName) {
  this.firstName = firstName
  this.lastName = lastName
}
Person.prototype.getFullName = function() {
  return this.firstName + ' ' + this.lastName
}
var newPerson = new Person('jack', 'bob')
var _newPerson = _new(Person, 'jack', 'bob')

5.手写instanceof

代码语言:javascript
AI代码解释
复制
// 思路:右边变量的原型存在于左边变量的原型链上
function instanceOf(left, right) {
  let leftValue = left.__proto__
  let rightValue = right.prototype
  while (true) {
    if (leftValue === null) {
      return false
    }
    if (leftValue === rightValue) {
      return true
    }
    leftValue = leftValue.__proto__
  }
}

6.手写create

代码语言:javascript
AI代码解释
复制
// 思路:将传入的对象作为原型
function create(obj) {
  function F() {}
  F.prototype = obj
  return new F()
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
当然,这个linux界面仅能用于学习linux基本操作,想要实战处理数据跑程序的话你的电脑配置不够,需要用到服务器。如果你所在单位有服务器,可以直接申请账号。如果没有可以去阿里云官网看看。远程登录服务器需要下载一个免安装软件putty,需要ip地址和用户名就可以登录了。
当然,这个linux界面仅能用于学习linux基本操作,想要实战处理数据跑程序的话你的电脑配置不够,需要用到服务器。如果你所在单位有服务器,可以直接申请账号。如果没有可以去阿里云官网看看。远程登录服务器需要下载一个免安装软件putty,需要ip地址和用户名就可以登录了。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
call,apply,bind 的完全实现和理 解
apply(),call()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是第一个参数。
ZEHAN
2020/09/23
8830
JavaScript之手写call、apply、bind函数
😎 手写call函数 实现步骤: 判断调用对象是否为函数,即使我们是定义在函数的原型上的,但是可能出现使用call等方式调用的情况 判断传入上下文对象是否存在,如果不存在,则设置为window 处理传入的参数,截取第一个参数后的所有参数 将函数作为上下文对象的一个属性 使用上下文对象来调用这个方法,并保存返回结果 删除刚才新增的属性 Function.prototype.myCall=function(context){ //判断调用对象 if(typeof this !== 'funct
henu_Newxc03
2022/05/11
4070
JS手撕(四) call、apply、bind、柯里化、偏函数
所以原理就是给传入的第一个参数添加临时方法,然后去调用这个临时方法,这个时候,这个方法的this就会指向第一个参数啦,最后当然还要临时方法删除掉,不留下痕迹。
赤蓝紫
2023/01/01
6210
apply/call/bind 自我实现
面试题:“call/apply/bind源码实现”,事实上是对 JavaScript 基础知识的一个综合考核。
前端迷
2019/09/19
4620
apply/call/bind 自我实现
通过自己实现函数 call,apply,bind 来了解他们的原理
我们知道函数中的call,apply,bind都是可以修改函数的this指向。关于函数的this指向问题可以转到Javascript this 指向问题这篇文章。
踏浪
2019/08/22
8730
解析call、apply、bind三者区别及实现原理
不管在写插件,还是写框架,又或者其它业务开发中。我们都会遇到在执行函数的时候,如果需要保证函数内部this不被污染或者说需要使函数内部this指向到指定对象的时候,都会按情况分别使用到call、apply、bind方法来实现需求。
吴佳
2022/09/26
3.1K0
彻底弄清 this call apply bind 以及原生实现[2019-3-12更新]
有关 JS 中的 this、call、apply 和 bind 的概念网络上已经有很多文章讲解了 这篇文章目的是梳理一下这几个概念的知识点以及阐述如何用原生 JS 去实现这几个功能
JS菌
2019/04/10
4480
彻底弄清 this call apply bind 以及原生实现[2019-3-12更新]
手写apply、call、bind
各位宝宝,马上就要过中国年了,已经开启了放假模式了吗?放假了就好好的休息哈,该玩的时候玩、该学的时候学,就对了~
用户3258338
2020/02/17
5240
前端面试中常考的源码实现
如果一个函数作为一个对象的属性,那么通过对象的.运算符调用此函数,this就是此对象
心谭博客
2020/04/20
4250
面试题目之原生实现call、apply、bind
去年写了篇文章,call、apply和bind的区别,但是随着市场对前端工程师的要求越来越高,我们也要与时俱进,需要深入的了解一下这三个方法的原理。
挥刀北上
2019/07/19
8720
this,call,apply,bind(万字长文)
前言 大家好啊,我是吒儿?,每天努力一点点?,就能升职加薪?当上总经理出任CEO迎娶白富美走上人生巅峰?,想想还有点小激动呢?。 这是我的第13期文章内容✍,希望能够把每一处知识点,说明白,(当然,如
达达前端
2020/06/16
1.3K0
js底层原理,助你更好的完成技术上的提升
1. 实现一个call函数 // 思路:将要改变this指向的方法挂到目标this上执行并返回 Function.prototype.mycall = function (context) { if (typeof this !== 'function') { throw new TypeError('not funciton') } context = context || window context.fn = this let arg = [...arguments].sl
前端老鸟
2019/07/31
7550
前端应该要掌握的几种手写代码实现
https://juejin.im/post/5e24590ef265da3e152d27bc
前端迷
2020/02/19
9300
bind、call、apply 区别
call 和 apply 都是为了解决改变 this 的指向。作用都是相同的,只是传参的方式不同。 除了第一个参数外,call 可以接收一个参数列表,apply 只接受一个参数数组。
前端迷
2019/12/05
6780
一文理解 this、call、apply、bind
记得差不多在两年多之前写过一篇文章 两句话理解js中的this[1],当时总结的两句话原话是这样的:
木子星兮
2020/07/17
4610
【THE LAST TIME】this:call、apply、bind
讲道理,这篇文章有些拿捏不好尺度。准确的说,这篇文章讲解的内容基本算是基础的基础了,但是往往这种基础类的文章很难在啰嗦和详细中把持好。文中道不到的地方还望各位评论多多补充指正。
Nealyang
2019/10/18
6480
【THE LAST TIME】this:call、apply、bind
死磕 36 个 JS 手写题(搞懂后,提升真的大)
作为一个程序员,代码能力毋庸置疑是非常非常重要的,就像现在为什么大厂面试基本都问什么 API 怎么实现可见其重要性。我想说的是居然手写这么重要,那我们就必须掌握它,所以文章标题用了死磕,一点也不过分,也希望不被认为是标题党。
用户4456933
2021/06/01
1.2K0
call、apply、bind
刚开始写技术笔记的时候,很浅显的写了一篇this的指向问题,现在看起来不能说错误百出,但也确实是没什么技术水平。今天分享自己对于call、apply、bind新的认识,并手写一个自己的call、apply、bind。
wade
2020/04/23
1.2K0
call、apply、bind实现原理
call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。即:可以改变当前函数的this指向;还会让当前函数执行。
ClyingDeng
2022/11/29
5010
bind、call、apply的实现
bind、call、apply是JavaScript中Function.prototype非常重要的三个方法,他们的作用是改变this的指向。三者的区别是:
kai666666
2020/10/17
5580
相关推荐
call,apply,bind 的完全实现和理 解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场