当被问到JS中有哪些调用模式,你知道怎么回答吗?

676 阅读3分钟

前言

调用模式是一种软件设计模式,通常用于描述对象之间的交互方式。在调用模式中,对象之间通过调用彼此的方法或函数进行通信和交互。调用模式可以帮助开发人员组织代码结构,简化代码逻辑,提高代码的可读性和可维护性。常见的调用模式包括观察者模式、策略模式、工厂模式等。那么在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);

image.png

分析 该方法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());

image.png

如果不用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());


image.png

构造器调用模式

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());
    

image.png

分析:该构造函数是结合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到这四种调用模式了吗?如果有更好的见解记得告诉我哟~

image.png