bind返回函数被当成构造函数的情况

在MDN中有这么一句话

1
2
bind()中的第一个参数:调用绑定函数时作为 this 参数传递给目标函数的值。
如果使用new运算符构造绑定函数,则忽略该值

那么这句话啥意思呢??

首先,我们都知道bind()会返回一个新的函数,如果这个返回的新的函数作为构造函数创建一个新的对象,那么此时this不再指向传入给bind的第一个参数,而是指向用new创建的实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function func (name) {
console.log(this);
this.name = name
}
func.prototype.hello = function () {
console.log(this.name);
}
let obj = {
a: 1,
say: function () {
console.log('say');
}
}
let newObj = func.bind(obj)
newObj()
//{a:1, say:f} 此时this指向obj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function func (name) {
console.log(this);
// func{}
this.name = name
}
func.prototype.hello = function () {
console.log(this.name);
}
let obj = {
a: 1,
say: function () {
console.log('say');
}
}
let newObj = func.bind(obj)
// 若将返回的函数作为构造函数
let o = new newObj('seven')
//this的指向发生了改变,指向原函数,并且可以访问原函数的原型
console.log('o', o);
// func{name:'seven'}
o.hello() // seven