Function.prototype.myBind = function(context = window){
const _this = this
const args = [...arguments].slice(1)
return function F(){
if(this instanceof F){
return new _this(...args,...arguments)
}
return _this.apply(context,args.concat([...arguments]))
}
}
以上为模拟bind方法
核心思想就是将方法执行时候得this保存在另外一个变量中(此时的this一定指向一个函数,因为只有函数才能调用bind函数)
Function.prototype.myApply = function(context = window){
context.fn = this
let result
if(arguments[1]){
result = context.fn(...arguments[1])
}else{
result = context.fn()
}
delete context.fn
return result
}
以上为模拟apply方法
核心思想是执行myApply方法的时候this一定为一个函数,假设传入的context的一个属性(fn)为这个函数,那么根据定义apply方法也就是运行了一次这个函数而已,得到结果后将context中刚刚添加得fn属性删除即可
Function.prototype.myCall = function(context = window){
context.fn = this
const args = [...arguments].slice(1)
const result = context.fn(...args)
delete context.fn
return result
}
以上为模拟call方法
核心思想同上
function _new(){
const Con = arguments[0]
const args = [...arguments].slice(1)
const obj = Object.create(Con.prototype)
const result = Con.apply(obj,args)
return typeof result === 'object'?result:obj
}
以上为模拟new方法
核心思想为new方法得定义
new方法实现了以下几步
创建一个新对象,继承父类原型上的属性
添加父类的属性到新的对象并且初始化,保存方法执行结果
如果执行函数有返回值切返回一个对象,则返回执行结果,否则则返回新创建的对象