JavaScript 手写call,apply,bind的实现
程序员文章站
2022-07-14 14:25:10
...
思路:
-
call和apply实现思路:
- 判断是否是函数调用,若非函数调用抛异常
- 通过新对象(context)来调用函数
- 给context创建一个fn设置为需要调用的函数
- 结束调用完之后删除fn
代码:
//call
Function.prototype.my_call = function (context){
//判断是否是函数调用,不是就抛出异常
//这里的this 就是调用my_call的
if(typeof this !== 'function') {
throw new TypeError('Not a Function')
}
//不传参数默认就为window
context = context || window
//保存this
context.fn = this
//保存参数
//Array.from 把伪数组对象转为数组
//arguments:是一个对应于传递给函数的参数的类数组对象
let args = Array.from(arguments).slice(1)
//调用函数
let result = context.fn(...args)
//调用结束删除函数
delete context.fn
return result
}
//apply
Function.prototype.my_apply = function(context){
//判断是否是函数调用,不是就抛出异常
//这里的this就是调用my_apply的
if( typeof this !== 'function'){
throw new TypeError('Not a Function')
}
let result
//默认为window
contex = context || window
//是否传参
if(arguments[1]){
result = context.fn(...arguments[1])
}else{
result = context.fn()
}
//删除函数
delete context.fn
return result
}
思路
- bind实现思路:
-
判断是否是函数调用,若非函数调用抛出异常
-
返回函数
- 判断函数的调用方式,是否是被new出来的
- new出来的话,返回空对象,但是实例的 __ proto__ 指向_this的prototype
-
完成函数柯里化
- Array.prototype.slice.call()
-
代码:
Function.prototype.my_bind = function(context){
//判断是否是为函数
if(typeof this !== 'function'){
throw new TypeError('Not a Function')
}
//保存调用bind的函数
const _this = this
//保存参数
const args = Array.prototype.slice.call(arguments,1)
//返回一个函数
return function F(){
//判断是否为new出来的
if(this instanceof F){
// 如果是new出来的
// 返回一个空对象,且使创建出来的实例的__proto__指向_this的prototype,且完成函数柯里化
return new _this(...args,...arguments)
}else {
//如果不是new出来的就改变this指向,且完成函数柯里化
return _this.apply(context,args.concat(...arguments))
}
}
}
上一篇: 手写call,apply,bind函数
下一篇: Flink(18):Flink之累加器
推荐阅读
-
javascript基于原型链的继承及call和apply函数用法分析
-
使用 js 简单的实现 bind、call 、aplly代码实例
-
Javascript中apply、call、bind的用法讲解
-
浅谈JavaScript中的apply/call/bind和this的使用
-
javascript中call,apply,bind函数用法示例
-
apply、bind、call方法的作用与区别
-
详解JavaScript函数callee、call、apply的区别
-
实现 call、apply、bind
-
【转】javascript笔记之apply、call、bind用法
-
使用JS简单实现apply、call和bind方法的实例代码