本文深入解析JavaScript中this关键字的四种调用模式:方法调用、函数调用、构造器调用以及Apply调用。详细阐述每种模式下this的绑定规则,包括对象属性的动态绑定、全局对象的默认绑定、new关键字创建新实例时的绑定,以及通过apply方法手动指定this值和参数数组的技巧。
JavaScript调用模式概述
在JavaScript中,函数调用时除了声明时定义的形参外,每个函数还会接收两个附加参数:this和arguments。其中,this在面向对象编程中扮演着核心角色,其具体指向取决于当前的调用模式。
JavaScript定义了四种主要的调用模式:方法调用模式、函数调用模式、构造器调用模式以及Apply调用模式。这四种模式在初始化关键参数this时存在显著差异,理解这些差异是掌握JavaScript面向对象特性的关键。
方法调用模式与this绑定
方法调用模式指的是当一个函数被保存为对象的一个属性时,该函数被称为方法。当通过属性访问表达式(即使用点号.或方括号[]下标表达式)调用该函数时,它被视为方法调用。此时,this被绑定到该对象上。
代码如下:
var myObject = {
value: 0;
increment: function(inc){
this.value += typeof inc === 'number' ? inc : 1;
}
};
myObject.increment();
document.writeln(myObject.value);//1
myObject.increment(2);
document.writeln(myObject.value);//2 方法允许通过this访问所属对象,从而读取或修改对象的属性。this的绑定发生在调用时刻,这种“超级迟绑定”机制使得函数能够高度复用,只要通过this获取所属上下文,即可称为公共方法。
函数调用模式
函数调用模式是指当一个函数并非作为对象属性存在时,直接以函数形式进行调用。例如:var sum = add(3, 4);,此时sum的值为7。
当函数以函数调用模式执行时,this会被绑定到全局对象上。
构造器调用模式
构造器调用模式基于JavaScript的原型继承机制,这意味着对象可以直接从其他对象继承属性,且该语言是无类别的。
如果在函数调用前加上new关键字,JavaScript将创建一个隐藏连接到该函数prototype成员的新对象,同时this将被绑定到这个新创建的对象上。
Apply调用模式
Apply调用模式利用了JavaScript函数式面向对象的特点,即函数本身可以拥有方法。
apply方法允许我们构建一个参数数组,并利用该数组来调用函数。此外,它还提供了一种机制来显式选择this的值。
apply方法接受两个参数:第一个参数将被绑定给this的值,第二个参数是一个包含调用所需参数的数组。