这是我参与8月更文挑战的第十九天,活动详情查看:8月更文挑战
绑定规则
我们来看看在函数的执行过程中调用位置如何决定this的绑定对象。我们需要先找到调用位置,然后判断需要应用四条规则中的哪一条。首先让我们来看看这四条规则
new绑定
这是第四条也是最后一条this的绑定规则,在讲new绑定之前需要澄清一个非常常见的关于JavaScript中的函数和对象的误解。JavaScript中new的机制实际上和面向类的语言完全不同。
首先让我们重新定义一下JavaScript中的“构造函数”。在JavaScript中,构造函数只是一些使用new操作符时被调用的函数。它们并不会属于某个类也不会实例化一个类。实际上,它们只是被new操作符调用的普通函数而已。譬如:Number()作为构造函数时的行为,ES5.1中是这样描述的:当Number在new表达式中被调用时,它是一个构造函数:它会初始化创建新的对象。
所以说,包括内置函数在内的所有函数都可以用new来调用,这种函数调用被称为构造函数调用。这里需要注意的细微差别在于:并不存在所谓的“构造函数”,只有对于函数的“构造调用”。当然,我们在广义上或者习惯上还是会说Number是内置的构造函数。
当我们使用new来调用函数时,或者说发生构造函数调用时,会自动的执行下面的操作:
- 创建(或者说构造)一个全新的对象。
- 这个新的对象会被执行Prototype连接。
- 这个新对象会绑定到函数调用的this。
- 如果函数没有返回其他对象,那么new表达式中的函数调用会自动的返回这个新对象。
function foo(a){
this.a = a;
}
var bar = new foo(2);
console.log(bar.a); //2
使用new来调用foo()时,会构造一个新的对象并将这个新对象绑定到foo()调用中的this上。new是最后一种可以影响函数调用时this绑定行为的方法,被称之为new绑定。