共计 1042 个字符,预计需要花费 3 分钟才能阅读完成。
Function.prototype.myBind = function () {
// 保留 this 此时 this 指向 greeting
let that = this
// this 必须是一个函数 bind 肯定绑定一个函数
if (typeof that !== 'function') {
throw new TypeError(
'Function.prototype.bind -' +
'what is trying to be bound is not callable'
)
}
// arguments 是 mybind 传入的所有参数
let thatArg = arguments[0]
// 咱们要把 bind 中残余的参数,全副传入到返回的函数中
// 第一个参数曾经用了,所以要从下标 1 开始取值 args 为 bind 外面的参数除了第一个之后的参数
let args = Array.prototype.slice.call(arguments,1)
let Fb = function () {
// 返回的函数中可能有参数,要把 bind 外面的参数和返回办法外面的参数合并
// args 是 bind 的参数
// Array.prototype.slice.call(arguments,1) 是以后返回函数的参数
let _args = [...args,Array.prototype.slice.call(arguments)]
// bind 会创立一个新的绑定函数,也能够用 new 运算符
// 判断 Bfn 是否是 new 函数 进去的
if(this instanceof Fb){ return that.apply(this,_args)
}else{ return that.apply(that,_args)
}
}
let fnop = function(){}
if(that.prototype){fnop.prototype = that.prototype}
Fb.prototype = new fnop()
return Fb
}
var obj = {name: 'Smiley'}
var greeting = function (str, lang) {
this.value = 'greetingValue'
console.log('Welcome' + this.name + 'to' + str + 'in' + lang)
}
var objGreeting = greeting.myBind(obj, 'the world')
// objGreeting('JS');
var newObj = new objGreeting('JS');
console.log(newObj.value);
正文完
发表至: javascript
2021-11-17