在学习bind的实现方法时,对于源码的instanceof一直百思不得其解。只知道是和new 关键字有关联。
是使用了new之后 原型指向就改变了吗?
Function.prototype.myBind = function(ctx, ...args) {
const _this = this
const o = function() {}
const fn = function(...payload) {
const p = [...args, ...payload]
if(this instanceof o) {
_this.myApply(this, p)
}else {
_this.myApply(ctx, p)
}
}
console.log(_this, _this.prototype)
o.prototype = _this.prototype
fn.prototype = new o
return fn
}
function person() {
console.log(this)
}
person.prototype.getName = function() {}
const obj = {
name: 'jack'
}
const p = person.myBind(obj2)
const pp = new p()
上面p函数如果直接调用 bind里的fn内部this就指向window
但是如果用new实例化,bind里的fn内部的this就指向了 fn
这一点我一直弄不明白。请教大神指点一下
上面p函数如果直接调用 bind里的fn内部this就指向window
但是如果用new实例化,bind里的fn内部的this就指向了 fn
如果 new p() fn 内部的 this 怎么会指向 fn 呢?指向的不应该是 fn 的实例?你可以去先了解一下 new 的原理。
这个代码中函数 o 就是用来隔离返回的函数 fn 和原函数的直接继承关系,instanceof 其实就是检测返回的 fn 是否以 new 调用。
###个人感觉理解有几点误区:
上面p函数如果直接调用 bind里的fn内部this就指向window
此时函数
_this
内部的this
变量指向的是ctx
但是如果用new实例化,bind里的fn内部的this就指向了 fn
此时函数
_this
内部的this
变量指向的是函数fn
的this
可以看下这个,里面有关于bind
函数的实现解析。