[路飞]每日一答:如果一个构造函数,bind了一个对象,用这个构造函数创建出的实例会继承这个对象的属性吗?为什么?

387 阅读1分钟

如果一个构造函数,bind了一个对象,用这个构造函数创建出的实例会继承这个对象的属性吗?为什么?

一.绑定的四大原则

1. new 绑定

通过关键字 new 进行绑定

var a = 1; 
function Person(a){ 
    this.a = a;
    console.log(this.a); 
}
const p = new Person(2); // 2 
console.log(p.a); // 2

2. 显式绑定:callapplybind

显式绑定是指我们通过call、apply以及bind方法改变this的行为,相比隐式绑定,我们能清楚的感知 this 指向变化过程。

var a = 'window';
var obj1 = {
    a:1,
    test:function(){
        console.log(this.a);
    }
};
var obj2 = {
	a:2,
};
obj1.test(); // 1
obj1.test.call(obj2); // 2

3. 隐式绑定:

如果函数调用时,前面存在调用它的对象,那么this就会隐式绑定到这个对象上

var a = 'window';
var obj = {
    a:1,
    test:function(){
            console.log(this.a);
    }
};
obj.test(); // 1

4. 默认绑定:

this默认绑定我们可以理解为函数调用时无任何调用前缀的情景,称之为默认绑定

// 在非严格模式下
var a = 'window';
function test() {
	console.log(this.a);
}
test(); // window
// 在严格模式下
var b = 'window';
function testNext() {
    console.log(this.b);
}
testNext(); // undefined

优先级: 四个规则优先级为:new => 显式 => 隐式 => 默认,函数this的确定是函数谁调用this就指向谁;注意一点,箭头函数是独立于这四个规则之外的。

总结

根据绑定的优先级我们可以知道用这个构造函数创建出的实例优先级是最高的,因此不会继承之前bind的属性。会以 new 出来新对象优先。