前言
调用模式是一种软件设计模式,通常用于描述对象之间的交互方式。在调用模式中,对象之间通过调用彼此的方法或函数进行通信和交互。调用模式可以帮助开发人员组织代码结构,简化代码逻辑,提高代码的可读性和可维护性。常见的调用模式包括观察者模式、策略模式、工厂模式等。那么在JS中有哪些调用模式呢?
- 方法调用模式
- 函数调用模式
- 构造器调用模式
- apply调用模式
这些模式在如何初始化关键参数this上存在差异。
注意:
- 调用运算符是跟在任何一个产生函数值表达式之后的一对圆括号,圆括号内可包含零个或多个用逗号隔开的表达式;
- 当实际参数(arguments)的个数与形式参数(parameters)的个数不匹配时不会导致运行时错误,如果实参过多了,超出的被忽略,实参过少了,缺失的被替换为undefined;
- 对参数值不会进行类型检查,任何类型的值都可以被传递给参数
调用模式
方法调用模式
当一个函数被保存为对象的一个属性时,将它称为一个方法。当该方法被调用的时候this被绑定到该对象上。
代码
var o = {
value : 0,
increment: function(inc) {
this.value += typeof inc === 'number' ? inc : 1;
//如果inc为数值类型则value=inc,反之value=1
}
}
}
o.increment()
console.log(o.value);
o.increment(2)
console.log(o.value);
分析 该方法increment可以通过对象this去访问,所以可以通过从对象中取值或修改该对象。注意:this到对象的绑定发生在调用的时候,这个“超级”迟绑定使得函数可以对this高度复用**,通过this取得它们所属对象的上下文的方法称为公共方法。
函数调用模式
当一个函数并非一个对象时,它被当做一个函数来调用:
var sum = add(3 ,4);
分析:当函数以此模式调用时,this被绑定到全局。这是语言设计上的一个错误,当内部函数被调用时,this应该被绑定到外部函数的this变量,这个设计错误的后果是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定到了错误的值,不能共享该方法对对象的访问权。有一个解决方案:给该方法定义一个变量that并赋值this,那么内部函数就可以通过该变量访问this。
代码:
var o = {
value : 3,
getValue: function (){
return this.value;
}
}
var add =function(a ,b){
return a+b;
}
o.double = function() {
var that = this;
var helper = function(){
that.value = add(that.value, that.value)
};
helper();
}
o.double()
console.log(o.getValue());
如果不用that
var o = {
value : 3,
getValue: function (){
return this.value;
}
}
var add =function(a ,b){
return a+b;
}
o.double = function() {
// var that = this;
var helper = function(){
this.value = add(this.value, this.value)
};
helper();
}
o.double()
console.log(o.getValue());
构造器调用模式
JS是一门基于原型继承的语言,这意味着对象可以直接从其他对象继承属性
代码:
var Quo = function (string) {
this.status = string;
};//创建一个构造函数
Quo.prototype.get_status = function() {
return this.status;
};//给构造函数的所有实例提供一个公共方法
var myQuo = new Quo('confused');
console.log(myQuo.get_status());
分析:该构造函数是结合new前缀调用的函数。
apply调用模式
分析:因为JS是一门函数式面向对象编程语言,所以该函数拥有方法-->apply:该方法接收两个参数,第一个是将绑定给this的值,第二个是一个参数数组。
代码:
var Quo = function (string) {
this.status = string;
};//创建一个构造函数
Quo.prototype.get_status = function() {
return this.status;
};//给构造函数的所有实例提供一个公共方法
var arr = [3 ,4];
var add =function(a ,b){
return a+b;
};
var sum = add.apply(null ,arr);
console.log(sum);
var statusObject = {
status:'A-OK'
};
var status = Quo.prototype.get_status.apply(statusObject);
console.log(status);
分析:statusObject并没有继承自Quo.prototype,但我们可以通过apply在statusObject上调用get_status方法。
结语
get到这四种调用模式了吗?如果有更好的见解记得告诉我哟~