js高级:手写实现apply/call/bind

1、实现apply/call

function foo(name,age){
	console.log(this,name,age)
}
// foo 函数可以通过apply/call
// foo.apply("aaa",["why",18])
// foo.call("bbb","kobe",30)

Function.prototype.hyexec= function(thisArg,otherArgs){
	// this -> 通用的函数对象
	// thisArg -> 传入的第一个参数,要绑定的this
	// console.log(this) // -> 当前调用的函数对象
	// this.apply(thisArg)
	
	// 1、获取thisArg,并且确保是一个对象类型
	thisArg = (thisArg === null || thisArg === unndefined) ? window:Object(thisArg)
	// thisArg.fn = this
	Object.defineProperty(thisArg,"fn",{
		enumerable:false,
		configurable:true,
		value:this
	})
	thisArg.fn(...otherArgs)
	delete thisArg.fn
}

// 1、给函数对象添加方法:hyapply
Function.prototype.hyapply = function(thisArg,otherArgs){
	this.hyexec(thisArg,otherArgs)
}
Function.prototype.hycall = function(thisArg,...otherArgs){
	this.hyexec(thisArg,otherArgs)
}
foo.hyapply({name:"why"},["james",25])
foo.hyapply(123,["why",18])

foo.hycall({name:'why'},"james",25)
foo.hycall(123,"why",18)
foo.hycall(null,"kobe",30)

2、bind实现

function foo(name,age,height,address){
	console.log(this,name,age,height,address)
}
// Function.prototype
// var newFoo = foo.bind({name:"why"},"why",18)
// newFoo(1.88)

// 实现hybind函数
Function.prototype.hybind = function(thisArg,...otherArgs){
	thisArg = thisArg === null || thisArg ===undefined ? window : Object(thisArg)
	Object.defineProperty(thisArg,"fn",{
		enumerable:false,
		configurable:true,
		writable:false,
		value:this
	})
	return (...newArgs) =>{
		var allArgs = [...otherArgs,...newArgs]
		thisArg.fn(...allArgs)
	}
}
var newFoo = foo.hybind("abc","kobe",30)
newFoo(1.88,"北京市")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值