You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
其中最核心的是第二句:temp.__proto__ = fn.prototype,�因为 new 出来的对象实例必定满足这个条件,我们便知道可以用 fn.prototype 是否为对象实例的原型来处理类似 new (funcA.bind(thisArg, args)) 的情况。
functionbind3(asThis){varslice=Array.prototype.slice;varargs1=slice.call(arguments,1);varfn=this;if(typeoffn!=="function"){thrownewError("Must accept function");}functionresultFn(){varargs2=slice.call(arguments,0);returnfn.call(resultFn.prototype.isPrototypeOf(this) ? this : asThis,// new 的情况下 this 改绑成 new 出来的对象实例args1.concat(args2));}resultFn.prototype=fn.prototype;returnresultFn;}
The text was updated successfully, but these errors were encountered:
本文是前端手写系列的第二篇,讲如何手写一个 bind,会从 bind 用法开始,逐渐带你领略手写 bind 的三种境界。
bind 用法
bind 是用来干嘛的?跟 bind 发音其实很像,是用来绑定 this 的。
具体怎么用呢?让我们先来看一个 bind 的简单用法:
语法很简单,就是函数绑定 this ——
function.bind(thisArg[, arg1[, arg2[, ...]]])
,它返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。既然 bind 用法不难,大家有没有想过要怎么实现一个 bind 呢?
三重境界实现 bind
const
、...
操作符new
new
new
初阶
这里直接上代码了,不熟悉ES6的可以试着用用展开操作符...,很好很强大
中阶
进阶中阶的话,我们需要注意参数不能再用
...args
拿了,要使用Array.prototype.slice(arguments)
。高阶
终于来到高阶了,写之前,让我们先来看下应当如何判断一个对象实例是否是通过
new 构造函数()
创建出来的。const temp = new fn(args)
其实等价于如下代码:其中最核心的是第二句:
temp.__proto__ = fn.prototype
,�因为 new 出来的对象实例必定满足这个条件,我们便知道可以用fn.prototype
是否为对象实例的原型来处理类似new (funcA.bind(thisArg, args))
的情况。The text was updated successfully, but these errors were encountered: