重写 Function.prototype.bind

发布于 2023-05-12 08:56:01 字数 1579 浏览 51 评论 0

该方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

function.bind(thisArg [, arg1 [, arg2 [, ...]]])

参数 thisArg

  • 如果使用 new 运算符构造绑定函数,则忽略该值。
  • 当使用 bindsetTimeout 中创建一个函数(作为回调提供)时,作为 thisArg 传递的任何原始值都将转换为 Object
  • 如果 bind 函数的参数列表为空,执行作用域的 this 将被视为新函数的 thisArg

参数 arg1、arg2...

当目标函数被调用时,被预置入绑定函数的参数列表中的参数。

返回值

返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。

重写 bind 方法

const point = {
  x: 0,
  y: 0,
  z: 0
}

// 构造函数
function Point(x, y, z) {
  console.log(this.x, x, y, z)
  console.log('')
}

// 函数名写成 bindy,是为了方便与原生 bind 方法对比
Function.prototype.bindy = function (context) {
  const _this = this
  const args = Array.prototype.slice.call(arguments, 1)
  const tempFn = function () {}

  const fn = function () {
    const thatArgs = Array.prototype.slice.call(arguments)
    _this.apply(this instanceof _this ? this : context, args.concat(thatArgs))
  }

  // 圣杯模式
  tempFn.prototype = this.prototype
  fn.prototype = new tempFn()

  return fn
}

// bind 可以在调用的时候传入参数
Point.bind(point, 1, 2)(3) // output: 0 1 2 3
Point.bindy(point, 4, 5)(6) // output: 0 4 5 6

// 使用 new 去构造时,bind 绑定的 this 最终会执行构造函数
const p = Point.bind(point)
const p2 = Point.bindy(point)
new p(3, 3, 3) // output: undefined 3 3 3
new p2(4, 4, 4) // output: undefined 4 4 4

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

亽野灬性zι浪

文章 0 评论 0

少年亿悲伤

文章 0 评论 0

南七夏

文章 0 评论 0

qq_EJoXxu

文章 0 评论 0

17780639550

文章 0 评论 0

萌逼全场

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文