Function.prototype.myCall = function(apply,...args) {
apply.fn = this
let r = apply.fn(...args)
delete apply.fn
return r
}
Function.prototype.myApply = function(apply,args) {
apply.fn = this
let r = apply.fn(...args)
delete apply.fn
return r
}
/**
* 1. 绑定函数this指向,并且不执行
* 2. apply为undefined\null时,this指向window;为其他基本数据类型时为数据类型的原型对象
* 3. 返回的函数可以被new,原型要指回bind之前的原型且不会影响原来的原型,this指向实例
* @param apply
* @param args
* @returns
*/
Function.prototype.myBind = function(apply,...args) {
let _this = this
function Fnop() {}
function c(...arg) {
if(typeof apply === 'undefined' || apply === null){apply = window}
//如果this时Fnop的实例,apply不会被改变还是指向实例
if(this instanceof Fnop) apply = this
apply.fn = _this
let r = apply.fn(...args, ...arg)
delete apply.fn
return r
}
Fnop.prototype = this.prototype
//修改c的prototype不能影响this.prototype
c.prototype = new Fnop()
return c
}
手写call、apply、bind
最新推荐文章于 2024-10-09 00:58:21 发布